c# - 覆盖方法以更改返回类型

标签 c#

我有一种情况,我想覆盖基类的一个方法,以便稍微改变该方法的返回类型。稍微改变我的意思是返回一个对象,该对象继承自基类型中的方法返回的对象......实际上,一些代码会使这更容易......

class Program
{
    static void Main(string[] args)
    {
        var obj = new ParentClass();
        Console.WriteLine("Parent says: " + obj.ShowYourHand());

        var obj2 = new ChildClass();
        Console.WriteLine("Child says: " + obj2.ShowYourHand());

        Console.ReadLine();
    }
}

public class ParentClass
{
    public string ShowYourHand()
    {
        var obj = GetExternalObject();
        return obj.ToString();
    }
    protected virtual ExternalObject GetExternalObject()
    {
        return new ExternalObject();
    }
}

public class ChildClass : ParentClass
{
    protected virtual new ExternalObjectStub GetExternalObject()
    {
        return new ExternalObjectStub();
    }
}

public class ExternalObject
{
    public override string ToString()
    {
        return "ExternalObject";
    }
}

public class ExternalObjectStub : ExternalObject
{
    public override string ToString()
    {
        return "ExternalObjectStub";
    }
}

我遇到的问题是 obj2 的实例不调用它的 GetExternalObject() 版本,而是使用它的父级实现。

我认为它这样做是因为在代码中

var obj = GetExternalObject();

obj的类型应该是父类中的ExternalObject。但是我明白 C# 无法根据返回类型区分方法。

我知道还有其他解决方案可以解决这个问题,例如定义一个 IExternalObject,所以不要太在意这个问题。我只想知道阻止子类 GetExternalObject 甚至被子类本身调用的想法是什么?

或者我在做一些完全愚蠢的事情? :-)

最佳答案

Or am I doing something totally daft? :-)

是的,你是。您不能通过覆盖方法来更改方法的返回类型。无论如何,我在你的样本中不明白它。只需保留返回类型并返回一个新的 ExternalObjectStub。这是可行的,因为 ExternalObjectStub 派生自 ExternalObject

通过使用 new 隐藏基成员来更改返回类型通常是一个非常糟糕的主意,因为它会导致无法以多态方式使用的类。这正是您在这里遇到的情况:如果保存引用的变量的类型是 ParentClass 类型,它会调用 ParentClass 中的方法,即使实例确实是属于 ChildClass 类型,因为 ChildClass 不提供 GetExternalObject 的覆盖实现。

关于c# - 覆盖方法以更改返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7282737/

相关文章:

c# - Linq to XDocument 按子集分组

c# - 是否可以使用 JSON.Net 将 JSON 反序列化为 List<MyObject<T,K>>

c# - 如何获取当前选定键盘布局的显示名称

c# - 是否可以增加 winform 中日历弹出窗口的大小?

c# - 针对多种编程语言/平台

javascript - 在单个页面中管理多个 SignalR 连接

C# PrincipalServerdownException 即使我是真实用户

c# - 集合类型的初始容量,例如字典、列表

c# - 我们可以像在 c# 中的数据库中那样以排序方式将数据填充到文本框中吗?

c# - 将 XML(以格式化方式)显示到 Razor Textarea