注意:这个答案写于 2016 年。从那时起,返回类型协方差就被添加到了 C# 中(令人惊讶!)。阅读此答案时请记住这一点。
你想要的功能叫做返回类型协方差,而 C# 不支持。 (顺便说一下,C++ 确实如此。)
协变返回类型的常见情况是:
abstract class Animal
{
public abstract Cage GetCage();
}
public class Fish : Animal
{
public override Aquarium GetCage() { ... }
}
这是不合法的,但如果合法那就是safe。也就是说,如果你手上有一只动物,并且你要求一个笼子,你就会得到一个,即使它是一条鱼。为什么?因为水族馆是一种笼子。
您的提议不仅非法,而且不安全:
Animal animal = new Mouse();
animal.Teeth = new TRexTeeth();
合同规定,可以用任何种类的牙齿调用二传手。通过使派生类在可接受的内容方面更加严格,您违反了基类的约定。
所以不要这样做。
不过,您可以通过多种方法在 C# 中实现您想要的目标。
这只是其中之一:
interface IAnimal
{
Teeth Teeth { get; } // READ ONLY
}
class Mouse : IAnimal
{
private SmallTeeth smallTeeth;
public SmallTeeth Teeth
{
get { return smallTeeth; }
}
Teeth IAnimal.Teeth { get { return this.Teeth; } }
}
现在,如果您将鼠标投射到 Animal 上,您将获得返回 Teeth 的属性,如果您正常使用鼠标,您将获得返回 Small Teeth 的属性。
我在这里描述了解决这个问题的另一种方法:
C# 支持返回类型协方差吗? https://stackoverflow.com/questions/5709034/does-c-sharp-support-return-type-covariance/5709191#5709191
其他答案中给出的通用解决方案也有效,尽管我个人更喜欢将泛型排除在外,除非有必要。
搜索“C# 中的返回类型协方差”以获取有关此模式的更多信息。