我遇到了一些继承问题,因为我有一组相互关联的抽象类,需要一起重写它们才能创建客户端实现。理想情况下,我想做类似以下的事情:
abstract class Animal
{
public Leg GetLeg() {...}
}
abstract class Leg { }
class Dog : Animal
{
public override DogLeg Leg() {...}
}
class DogLeg : Leg { }
这将允许任何使用 Dog 类的人自动获取 DogLegs,任何使用 Animal 类的人自动获取 Legs。问题是重写的函数必须与基类具有相同的类型,因此无法编译。我不明白为什么不应该这样做,因为 DogLeg 可以隐式转换为 Leg。我知道有很多方法可以解决这个问题,但我更好奇为什么这在 C# 中不可能/实现。
EDIT:我对此进行了一些修改,因为我实际上在代码中使用属性而不是函数。
EDIT:我将其改回函数,因为答案仅适用于这种情况(属性设置函数的值参数的协方差不应该工作)。对于波动,敬请谅解!我意识到这让很多答案显得无关紧要。
简短的回答是 GetLeg 的返回类型是不变的。长答案可以在这里找到:协变和逆变 http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx
我想补充一点,虽然继承通常是大多数开发人员从工具箱中取出的第一个抽象工具,但几乎总是可以使用组合来代替。对于 API 开发人员来说,组合的工作量稍微多一些,但使 API 对于消费者来说更有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)