質問

私は言葉の正確な意味を理解CovarianceContravarianceいくつかの記事からオンラインや質問StackOverflowの上で、と私は理解することができたものから、それは多型のために別の単語の唯一のですしようとしています。

私は上記の文で正しいでしょうか?それとも私はそれが間違って持っている?

役に立ちましたか?

解決

これは確かに多型に関連しています。私は、彼らはしかし多型のためだけの「別の言葉」だ言わないだろう - 彼らはそれがの特定のコンテキストで別のタイプののであるかのように使用すると、1つのタイプを扱うことができる非常に特殊な状況、についてです<。 / P>

たとえば、通常の多型と、あなたはBananaへの参照としてFruitへの参照を扱うことができます - それは、あなたがFruitを置き換えることができますが、型Bananaを参照してくださいすべてのの時間を意味するものではありません。 List<Banana>List<Fruit>のためではなくlist.Add(new Apple())に対して有効であるため、例えば、List<Fruit>List<Banana>として扱うことはできません。

共分散(以下、特定の)「大きい」は、元の型はのみの(例えば、戻り値として)「出力」の位置で使用されるAPIで置換されて入力可能。 Contravarianceができる「より小さい」(より具体的な)元の型があるAPIで置換されて入力のみの「入力」位置で使用される。

これは、単一のSOポスト(うまくいけば他の誰かがこれよりも良い仕事を行いますが!)内のすべての詳細に入るのは難しいです。エリックリッペルトは、ブログの記事の優れたのシリーズはそれについてを持っています。

他のヒント

すべてのシャウトアウトしてくれてありがとう、みんなます。

ジョンとラスマスの答えは罰金です、私はちょうど迅速なテクニカルノートを追加することになります。

何気なくと非公式に話すときは、

、はい、人々は多型の特定の種類を参照するために、「共分散」と「contravariance」を使用します。つまり、それは動物のシーケンスであるかのようにあなたがクモのシーケンスを扱う多型の一種です。

私たちは、すべてのコンピュータsciency取得し、私はおそらくその共変性と反変性は、「多型のようなもの」であり、言わないだろう、より多くの技術的な定義をしようとしました。私はこのような多くの技術的な定義に近づきます。

まず、私はあなたが話しされる可能性がありますC#での多型の2つの可能性のある種類があることに注意したい、そしてそれらを混同しないことが重要です。

第一種は、伝統的に「アドホック多型」と呼ばれ、それはあなたがメソッドM(アニマルxを)持っている、とあなたはそれにクモやキリンやワラビーを渡す多型だし、この方法は、一様にその渡された扱われます動物の基本クラスによって保証共通点を使用して、引数と同じように。

第二種は伝統的に「パラメトリック多型」と呼ばれている、または「一般的な多型」。これは、一般的な方法のM<T>(T t)を行い、その後、再び、一様にT上の制約によって保証共通点に基づいて議論を扱うメソッドのコードの束を持っている能力です。

私はあなたがポリモーフィズムの第一種の話をしていると思います。しかし、私のポイントは、私たちが一様に知られている共通性に基づいて異なるものを扱うのにプログラミング言語の能力として多型を定義できるだけのことです。の(例えば、公知の塩基の種類、または既知の実装されたインタフェース。)

共変性と反変性は、の自分の型引数の既知の共通点から推測される一般的なタイプの間の共通点を活用するために、プログラミング言語の能力である。

あなたは多型の先進的な形としてコとcontravarianceについて考えることができます。だけでなく、それは、その親クラスであるかのように、子クラスを使用することができ、コポリマーおよびcontravarianceで、多型は、多型のクラスに関連するクラスに拡張します。

2つのクラスを想像します:

public class Pet { /*...*/ }
public class Cat:Pet { /*...*/ }

多型がCatとしてPetを使用することができるされている

void Feed(Pet pet) { /* ... */ }

Cat cat = ...
Feed(cat);

コポリマーおよびcontravarianceはICollection<Cat>(共分散)としてICollection<Pet>を使用することができることについて話をするために使用され

void FeedAll(ICollection<Pet> pets) { /* ... */ }

List<Cat> cats = ...
FeedAll(cats);

またはAction<Pet>としてAction<Cat>(contravariance)を使用する

Action<Pet> GetFeeder() { /* ... */ }

Action<Cat> feeder = GetFeeder();
彼らは第一の特徴を設計していた時に

エリックリペットはそれについての素晴らしいブログのシリーズを書きました。パート1は、ですここします。

私はこのコレクションを見つけます:

C#での共変性と反変性、第一部

<のhref = "http://blogs.msdn.com/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array-covariance.aspx" のrel = C#で "noreferrer">共変性と反変性、第二部:アレイ共分散する

<のhref = "http://blogs.msdn.com/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance。 ASPX」のrel = "noreferrer"> C#での共変性と反変性、パート3:メンバーグループの換算分散する

<のhref = "http://blogs.msdn.com/ericlippert/archive/2007/10/22/covariance-and-contravariance-in-c-part-four-real-delegate-variance.aspx" REL = "noreferrer"> C#での共変性と反変性、第四部:実委任分散する

<のhref = "http://blogs.msdn.com/ericlippert/archive/2007/10/24/covariance-and-contravariance-in-c-part-five-higher-order-functions-hurt-私-brain.aspx」のrel = "noreferrer" のC#で>共変性と反変性は、パート5:高階関数は、

の私の脳ハート>

<のhref = "http://blogs.msdn.com/ericlippert/archive/2007/10/26/covariance-and-contravariance-in-c-part-five-interface-variance.aspx" のrel = C#で "noreferrer">共変性と反変性、パート6:インタフェース分散する

<のhref = "http://blogs.msdn.com/ericlippert/archive/2007/10/29/covariance-and-contravariance-in-c-part-seven-why-do-we-need-・構文・アット・all.aspx」のrelは= 『noreferrer』> C#パートセブン共変性と反変性:なぜ我々はすべて構文では必要なのかの

<のhref = "http://blogs.msdn.com/ericlippert/archive/2007/10/31/covariance-and-contravariance-in-c-part-eight-syntax-options.aspx" のrel = C#で "noreferrer">共変性と反変性、パートエイト:構文オプションの

<のhref = "http://blogs.msdn.com/ericlippert/archive/2007/11/02/covariance-and-contravariance-in-c-part-nine-breaking-changes.aspx" のrel = C#で "noreferrer">共変性と反変性、パートナイン:重大な変更する

<のhref = "http://blogs.msdn.com/ericlippert/archive/2007/11/09/covariance-and-contravariance-in-c-part-ten-dealing-with-ambiguity.aspx" C#でのrel = "noreferrer">共変性と反変性、パートテン:あいまいするの対処

<のhref = "http://blogs.msdn.com/ericlippert/archive/2008/05/07/covariance-and-contravariance-part-twelve-to-infinity-but-not-beyond.aspx" REL = "noreferrer">共変性と反変性、パートセブンイレブン:無限にではなくを超えた。

私はあると思う特別な多型の種類ではないことのために別の言葉です。それはを代表者ベースの戻り値の型を持つデリゲートは、子のタイプを受け入れることができます。ここで、の中の多型である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top