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