OK、のはIContainer<T>
でFish
とA
、IA
IAnimal
と、B
Aquarium
と、そしてIB<T>
を交換しましょう。そして、我々はIContainer<T>
にメンバーを追加し、IAnimal
の第2の実施う:
// Model
public class Fish : IAnimal { }
public class Tiger : IAnimal { }
// ModelLogic
public class Aquarium : IContainer<Fish>
{
public Fish Contents { get; set; }
}
// Model Interface
public interface IAnimal { }
// ModelLogic Interface
public interface IContainer<T> where T : IAnimal
{
T Contents { get; set; }
}
IContainer<IAnimal> foo = new Aquarium(); // Why is this illegal?
foo.Contents = new Tiger(); // Because this is legal!
あなたはFOOにタイガーを置くことができます - fooが任意の動物を含むことができ、コンテナとして入力されます。しかし、あなたは水族館に魚を入れることができます。 Aquarium
で法的に実行できる操作は、IContainer<IAnimal>
で実行できる操作とは異なり、とは異なるため、の操作は実行できません。
したい機能が汎用インタフェース共分散と呼ばれ、はC#4でサポートされているですが、あなたがあなたの水槽の中に虎を置くことは決してありませんコンパイラに証明する必要があります。やりたいことです:
// Model
public class A : IA { }
// ModelLogic
public class B : IB<A> { }
// Model Interface
public interface IA { }
// ModelLogic Interface
public interface IB<out T> where T : IA { }
IB
上の共分散アノテーションを注意してください。このout
は、T
は入力としてではなく、の出力としてのみ使用できることを意味します。 T
が出力にすぎない場合、誰かが魚のタンクに虎を入れる方法はありません。なぜなら、可能なプロパティやメソッドがないからです。
私はその機能をC#に追加している間に、いくつかのブログ記事を書きました。あなたが機能に入った設計上の考慮事項に興味がある場合は、以下を参照してください
http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/
使用しているC#のバージョンは何ですか? – Oded
[共分散とContravarianceのFAQ](http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx)と[このブログシリーズ](http: /blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/)by Eric Lippert – Oded
BはIB であり、IBではありません。 –
Servy