【发布时间】:2011-11-09 02:39:27
【问题描述】:
我有一种情况,我想重写基类的方法,以便稍微改变方法的返回类型。通过稍微改变我的意思是返回一个对象,该对象继承自基类型中的方法返回的对象......实际上,一些代码会使这更容易......
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 甚至被子类本身调用?
还是我在做一些完全愚蠢的事情? :-)
【问题讨论】:
标签: c#