クライアント実装を作成するためにすべてを一緒にオーバーライドする必要がある相互に関連する抽象クラスのグループがあるため、いくつかの継承の問題が発生しています。理想的には、次のようなことをしたいと思います。
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#でこれが不可能/実装されていない理由についてはもっと興味があります。
編集:コードで関数の代わりにプロパティを実際に使用しているため、これを多少変更しました。
編集:答えはその状況にのみ適用されるため、関数に戻しました(プロパティの集合関数の値パラメーターの共分散は機能しないはずです)。変動してすみません!私はそれが多くの答えを無関係に見えるようにすることを理解しています。