ジェネリックが .NET に実装される方法では、.NET にFoo<T>
関係なく、すべてがほぼ同じように動作する必要がありますT
。とりわけ、メンバーがその定義Foo<T>
に含まれる可能性があるという事実を除いて、すべてが同じメンバーを持っている必要があります。から継承できるT
場合、どのメンバーが公開されているかを知るには、どのメンバーが公開されているかを知る必要があります。たとえば から派生した型にのみ使用されることがわかっている場合、 a を定義できますが、それは a を--not as aとしてのみ使用できるようにします。Foo<T>
T
Foo<T>
T
Foo<Automobile>
Foo<Cat>
Foo<T>
Animal
class Foo<T> : Animal where T:Animal
Foo<Cat>
Animal
Cat
しかし、多くの場合、実際に必要なのはFoo<T>
を実際に継承する型ではT
なく、ほとんどが のように動作するオブジェクトを作成する機能T
ですが、いくつかの違いがあります。.NET Framework では、これを直接行うこともできませんが、その目的でプロキシ オブジェクトを自動生成できるライブラリがいくつかあります。それぞれがいくつかのインターフェイス メンバーを実装し、それらすべてを集合的に実装するインターフェイスと 1 つ以上のオブジェクトを指定すると、プロキシ ジェネレーターは (実行時に!) 提供されたオブジェクトへの参照を保持し、そのインターフェイスを実装する新しいクラスを作成します。各インターフェイス メソッドに対して、渡されたオブジェクトの 1 つの対応するメソッドにチェーンするクラス メソッドを作成します。
これらの新しいクラスを作成するメソッドはジェネリックになりますが、クラス自体はそうではないことに注意してください。が a を返し、 aがmyProxyMaker.Create<IFoo>(IFlyingMammal)
a を返す可能性があります。まったく別のクラスなので、メンバーが異なっていても問題ありません。クラスが醜いマシン生成名を持っている可能性があるという事実は、タイプorの変数を宣言するのではなく、タイプandを宣言するため、実際には問題になりません。proxy8675309
myProxyMaker.Create<ISwimmingMammal>
proxy24601
IFlyingMammal
ISwimmingMammal
proxy8675309
proxy24601
IFlyingMammal
ISwimmingMammal