8

私はクラスAを持っています:

public class ClassA<T>

クラス B は A から派生します。

public class ClassB : ClassA<ClassB>

クラス C はクラス B から派生します。

public class ClassC : ClassB

これで、制約付きのジェネリック メソッドができました

public static T Method<T>() where T : ClassA<T>

OK、今私は電話したい:

ClassC c = Method<ClassC>();

しかし、次のようなコンパイル エラーが表示されます。 Type argument 'ClassC' does not inherit from or implement the constraint type 'ClassA<ClassC>.

それでも、コンパイラは次のことを許可します。

ClassB b = Method<ClassB>();

私の理解では、代わりにClassC継承するため、これは失敗しますClassA<ClassB>ClassA<ClassC>

ClassB私の本当の質問は、ジェネリックメソッドで何らかの方法で使用できる派生クラスを作成することは可能ですか?

これは、ジェネリックが過剰に使用されているように見えるかもしれませんが、私は同意します. サブソニック データ オブジェクトから派生したビジネス レイヤー オブジェクトを別のプロジェクトで作成しようとしています。

注: < T > に余分なスペースを入れました。そうしないと、質問から削除されます。

4

3 に答える 3

7

さて、メソッドを次のように変更できます。

public static T Method<T,U>() where T : ClassA<U> where U : T

それはまったく役に立ちますか?方法を変えないとダメです もちろん…

于 2008-10-24T12:29:59.947 に答える
2

いいえ。このメソッドを変更またはラップする必要があります。

これが理由です。

ClassC は ClassA(ClassB) を継承する ClassB を継承します

ClassC は ClassA(ClassC) を継承しません

ClassB の子は ClassA (子クラス) から継承されません。これは、代わりに ClassB から継承され、ClassB が ClassA (子クラス) から継承されないためです。

ジェネリック型は不変です。

于 2008-10-24T12:39:43.377 に答える
1

ほとんどの場合、ベースとなる非ジェネリック抽象クラスを使用することで、このシナリオを解決できます。

public abstract class BasicClassA
{
}

public class ClassA<T> : BasicClassA
{
}

public class ClassB : ClassA<ClassB>
{
}

public class ClassC : ClassB
{
}

public static T Method<T>() where T : BasicClassA
{
    return null;
}

ただし、走行距離は異なる場合があります。

于 2008-10-24T12:59:07.393 に答える