【发布时间】:2010-11-06 03:21:56
【问题描述】:
有没有办法覆盖 C# 中的返回类型?如果是,如何,如果不是,为什么以及推荐的方法是什么?
我的情况是我有一个带有抽象基类及其后代的接口。我想这样做(不是真的,但作为一个例子!):
public interface Animal
{
Poo Excrement { get; }
}
public class AnimalBase
{
public virtual Poo Excrement { get { return new Poo(); } }
}
public class Dog
{
// No override, just return normal poo like normal animal
}
public class Cat
{
public override RadioactivePoo Excrement { get { return new RadioActivePoo(); } }
}
RadioactivePoo当然继承自Poo。
我想要这样做的原因是,那些使用Cat 对象的人可以使用Excrement 属性,而不必将Poo 转换为RadioactivePoo,而例如Cat 仍然可以是Animal 列出用户可能不一定知道或关心他们的放射性便便的地方。希望这是有道理的......
据我所知,编译器至少不允许这样做。所以我想这是不可能的。但是你会推荐什么来解决这个问题?
【问题讨论】:
-
泛型呢?他们不会帮忙吗?
-
不应该 Cat.Excrement() 只是将 RadioActivePoo 的实例返回为便便吗?你有一个通用的界面,使用它。 (感谢歇斯底里的例子。)
-
我也想对这个例子表示感谢:下面的@goodgai 建议创建抽象便便 - 我想知道如何向非程序员解释这个......
-
@Konrad:有点不确定我是否应该只是嘲笑那个精彩的评论,或者我是否还应该问一下它是否实际上是一种非常可怕的代码气味,应该是指出(因为在那种情况下我想知道它:p)
-
我对自己发现这些例子有多有趣感到几乎失望 XD
标签: c# inheritance types covariance overriding