私たちの社内トレーニングでは、すばらしい本「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>