我有一些继承问题,因为我有一组相互关联的抽象类,需要全部重写以创建客户端实现。理想情况下,我想这样做如下:为什么不继承我认为它应该工作的方式工作?
abstract class Animal
{
public Leg GetLeg() {...}
}
abstract class Leg { }
class Dog : Animal
{
public override DogLeg Leg() {...}
}
class DogLeg : Leg { }
这将使用Dog类任何人都可以自动获得狗腿和使用动物类来获得腿的人允许。问题是重写的函数必须与基类具有相同的类型,所以不能编译。我不明白为什么它不应该,因为DogLeg可以隐式地转化为Leg。我知道有很多方法可以解决这个问题,但我更加好奇为什么在C#中这是不可能的/实现的。
编辑:我修改了这个有点,因为我实际上在我的代码中使用属性而不是函数。
编辑:我改回了功能,因为答案只适用于这种情况(协方差属性上的设定功能不应该工作参数的值)。对不起,波动!我意识到这使得很多答案似乎无关紧要。
你的差异声明没有意义。 在子类型:协方差=相关类型被子类型& Contravariance =相关类型获得超类型。 当C#只允许一个不变的(相同的)返回类型时,这个问题表示一个协变(在子类型中使用的子类型)返回类型。 – 2008-09-07 16:58:20
您链接到的那些文章是关于泛型类型差异。问题是关于返回类型协方差。我在那些文章中明确指出我不*在谈论返回类型协方差。 – 2010-07-17 06:36:10