私はいくつかの継承の問題を抱えています。これは、クライアント実装を作成するために相互に関連する抽象クラスのグループをすべてオーバーライドする必要があるためです。理想的には私は、次のような何かをしたいと思います:これは誰でも自動的にドッグレッグして足を取得するにはAnimalクラスを使用して、誰を取得するには、Dogクラスを使用できるようになる継承がうまくいかないと思うのはなぜですか?
abstract class Animal
{
public Leg GetLeg() {...}
}
abstract class Leg { }
class Dog : Animal
{
public override DogLeg Leg() {...}
}
class DogLeg : Leg { }
。問題は、オーバーライドされた関数は基本クラスと同じ型でなければならないため、これはコンパイルされません。私はDogLegが暗黙のうちにLegにキャスト可能であるので、なぜそうはならないのか分かりません。私はこれの周りに多くの方法があることを知っていますが、なぜこれが可能ではない/ C#で実装されているより興味がある。
EDIT:私はコードの中で実際に関数の代わりにプロパティを使用しているので、これを多少変更しました。
EDIT:答えは唯一のそのような状況(プロパティの設定機能の値パラメータの共分散すべきではない仕事)に適用されますので、私は、関数に戻ってそれを変更しました。変動のために申し訳ありません!私はそれが多くの答えを無関係と思わせることに気づきます。
あなたの声明は理にかなっていません。 サブタイプの場合:共分散=関連タイプがサブタイプになります。 コントラスト変動=関連タイプがスーパータイプになります。 この質問は、C#が不変(同じ)戻り型のみを許可するときに、共変量(サブタイプで使用されるサブタイプ)の戻り値の型を表します。 –
あなたがリンクしたそれらの記事は、一般的なタイプの差異に関するものです。問題は、戻り値の共分散についてです。これらの記事では、私が戻り値の共分散について話していないことを明示しています。 –
Eric Lippert:しかし、それらは本質的につながっています。ここをクリックしてください:http://apocalisp.wordpress.com/2009/08/27/hostility-toward-subtyping/ – Apocalisp