0

現在、派生するすべての(ジェネリック)クラスが、型パラメーターを受け入れ、同じ型の別のクラスを別の型パラメーターのみで返すデリゲートを受け入れるメソッドを持つジェネリック インターフェイスを構築しようとしています。

私は次のことを試しました:

public interface GenericInterface<out T, out SomeDerived>
    where SomeDerived<T> : GenericInterface<T, SomeDerived>
{
    SomeDerived<NT> bind<NT>(bindee<T, NT, SomeDerived<NT>> bindFunc);
}

public delegate AnotherDerived<T2> bindee<in T1, out T2, out AnotherDerived>(T1 param)
    where AnotherDerived<T2> : GenericInterface<T2, AnotherDerived>;

public class Derived<T> : GenericInterface<T, Derived>
{
    Derived<NT> bind<NT>(bindee<T, NT, Derived<NT>> bindFunc);
}

しかし、コンパイルに失敗し、次のエラーが発生します。

クラス、構造体、またはインターフェイス メンバー宣言の無効なトークン '<'

そのような場合の正しい設計は何ですか?

編集:

コンパイラ エラーの構文上の理由を理解しています。ジェネリック型引数を where 句のパラメーターに適用することはできません。そのような行動を模倣する最善の方法は何かを尋ねています。

4

1 に答える 1

2

私はここで手足を出して、ジェネリックでここでやろうとしていることは不可能だと言います。誰かが私が間違っていると思うなら、私は削除します。

それでは、これから始めましょう

interface IFoo<T> where T : IFoo<T>{}
class Foo<T> : IFoo<T> where T : IFoo<T>{}
class Bar<T> : Foo<T> where T : IFoo<T>{}

これをインスタンス化してみましょう。

var foo = new Foo< Bar< ....errr what now? ad infinitum... 

したがって、これを修正するには、クラスが次のようになるように再設計する必要があります。

interface IBase {}
interface IFoo<out T> where T : IBase { }
class Foo<T> : IFoo<T> where T : IBase { }

次に許可します:

IFoo<IBase> foo = new Foo<Base>();

【追記】

このような問題を回避できる関数レベルのジェネリックを使用できます...

interface IFoo<out T> where T : IBase
{
    IFoo<TBind> Bind<TBind>(Action<T, TBind> bindFunc) where TBind : IBase;
}
于 2013-09-14T12:44:38.543 に答える