必要な機能には名前があります。これはリターンタイプの共分散です。
C#でサポートされていない理由は次のとおりです。
インターフェイスを実装するときにC#がリターンタイプの継承を許可しない理由
他の答えはすべて、問題を解決するために不思議なことに繰り返されるテンプレートパターンのC#バージョンを使用することを示唆しています。私の意見では、パターンは解決するよりも多くの問題を引き起こします。詳細については、そのテーマに関する私の記事を参照してください。
http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx
この問題を解決するためのより良い方法は、次のパターンを使用することです。
abstract class Animal
{
protected abstract Animal ProtectedGetMother();
public Animal GetMother()
{
return this.ProtectedGetMother();
}
}
class Cat : Animal
{
protected override Animal ProtectedGetMother()
{
do the work particular to cats here
make sure you return a Cat
}
public new Cat GetMother()
{
return (Cat)this.ProtectedGetMother();
}
}
問題は、異なる戻りタイプで仮想メソッドをオーバーライドできないことです。だからしないでください。戻り値のタイプが異なるまったく新しいメソッドを作成し、仮想メソッドをクラス階層の実装の詳細にします。
Cat : Animal<Cat>
このテクニックは、この「猫は猫の動物である」というナンセンスよりも約10億倍理解しやすいものです。