0

このクラスがあるとしましょう

public Holder<T> : IHolder
{
    private mystring;
    private myobj;

    public Holder(T obj, string str)
    {
        mystring = str;
        myobj = obj;
    }
}

次に、通常の T と同じように Holder< T> を使用できるように、Holder< T> が T を拡張するようにしたいと考えています。これを行う方法はありますか?

たとえば、Holder< int> を int のように扱いたいと思います。

: T を追加するだけでは機能しませんが、別の方法があるかどうか知りたいです。

たとえば IEnumerable< int> など、暗黙的な変換は機能しません。

4

1 に答える 1

4

ジェネリックが .NET に実装される方法では、.NET にFoo<T>関係なく、すべてがほぼ同じように動作する必要がありますT。とりわけ、メンバーがその定義Foo<T>に含まれる可能性があるという事実を除いて、すべてが同じメンバーを持っている必要があります。から継承できるT場合、どのメンバーが公開されているかを知るには、どのメンバーが公開されているかを知る必要があります。たとえば から派生した型にのみ使用されることがわかっている場合、 a を定義できますが、それは a を--not as aとしてのみ使用できるようにします。Foo<T>TFoo<T>TFoo<Automobile>Foo<Cat>Foo<T>Animalclass Foo<T> : Animal where T:AnimalFoo<Cat>AnimalCat

しかし、多くの場合、実際に必要なのはFoo<T>を実際に継承する型ではTなく、ほとんどが のように動作するオブジェクトを作成する機能Tですが、いくつかの違いがあります。.NET Framework では、これを直接行うこともできませんが、その目的でプロキシ オブジェクトを自動生成できるライブラリがいくつかあります。それぞれがいくつかのインターフェイス メンバーを実装し、それらすべてを集合的に実装するインターフェイスと 1 つ以上のオブジェクトを指定すると、プロキシ ジェネレーターは (実行時に!) 提供されたオブジェクトへの参照を保持し、そのインターフェイスを実装する新しいクラスを作成します。各インターフェイス メソッドに対して、渡されたオブジェクトの 1 つの対応するメソッドにチェーンするクラス メソッドを作成します。

これらの新しいクラスを作成するメソッドはジェネリックになりますが、クラス自体はそうではないことに注意してください。が a を返し、 aがmyProxyMaker.Create<IFoo>(IFlyingMammal)a を返す可能性があります。まったく別のクラスなので、メンバーが異なっていても問題ありません。クラスが醜いマシン生成名を持っている可能性があるという事実は、タイプorの変数を宣言するのではなく、タイプandを宣言するため、実際には問題になりません。proxy8675309myProxyMaker.Create<ISwimmingMammal>proxy24601IFlyingMammalISwimmingMammalproxy8675309proxy24601IFlyingMammalISwimmingMammal

于 2013-10-31T21:32:34.103 に答える