6

重複の可能性:
共分散と反分散の違い

共分散と反分散とは何か、そして両者の違いを理解しようとしています。私はこのリンクを見てきましたが、これまでのところ次のことを理解しています。

共分散は、派生メンバーを基本メンバーに割り当てるプロセスです。そのような:

IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;

私が上記で正しいかどうかさえわかりません...推測します。基本的に、この 2 つが何であるか、またそれらの違いを理解できるように、最も簡単な言葉で説明してくれる人を探しています。

これに関して同様の議論のトピックがあることも理解していますが、ほとんどの回答は私が探していた種類の説明ではありません.

4

1 に答える 1

0

私たちの社内トレーニングでは、すばらしい本「Smalltalk, Objects and Design (Chamond Liu)」を使用して、次の例を言い換えました。- お役に立てれば...

「一貫性」とはどういう意味ですか? アイデアは、高度に置換可能な型を使用して型安全な型階層を設計することです。この一貫性を得る鍵は、サブタイプ ベースの適合性です。(ここでは、Liskov Substitution Principle (LSP) について高レベルで説明します。)

共分散: 静的な型付けで「一貫して」卵を産む鳥を想定してみましょう: タイプの鳥が卵を産む場合、鳥のサブタイプは卵のサブタイプを産むのではないでしょうか? たとえば、型 Duck が DuckEgg を産むと、一貫性が得られます。なぜこれが一貫しているのですか?そのような式で Egg anEgg = aBird.Lay(); は、参照 aBird は Bird または Duck インスタンスによって合法的に置換される可能性があるためです。戻り値の型は、Lay() が定義されている型に対して共変であると言います。サブタイプのオーバーライドは、より特殊なタイプを返す場合があります。=>「彼らはより多くを提供します。」</p>

反変性: ピアニストが静的タイピングで「一貫して」演奏できるピアノを想定してみましょう: ピアニストがピアノを演奏する場合、彼女はグランドピアノを演奏できるでしょうか? ヴィルトゥオーゾはグランドピアノを弾きませんか?(注意してください。ひねりがあります!) これは一貫性がありません! このような表現では aPiano.Play(aPianist); 、 aPiano を Piano または GrandPiano インスタンスで合法的に置き換えることはできません! GrandPiano は Virtuoso だけが演奏できます。ピアニストは一般的すぎます。GrandPianos は、より一般的なタイプで再生できる必要があり、再生は一貫しています。パラメータの型は、Play() が定義されている型に対して反変であると言います。サブタイプのオーバーライドは、より一般化されたタイプを受け入れる場合があります。=>「必要なものが少なくて済みます。」</p>

于 2011-07-10T20:30:11.447 に答える