派生クラスの一般的な制約
-
04-07-2019 - |
質問
クラス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
から派生したクラスを作成して、汎用メソッドで何らかの方法で使用できるかどうかです
これはジェネリック医薬品が過度に使用されているように見えるかもしれませんが、私は同意します。別のプロジェクトで亜音速データオブジェクトから派生するビジネスレイヤーオブジェクトを作成しようとしています。
注:<!> lt; T <!> gt;それ以外の場合は、質問から削除されます。
解決
まあ、メソッドを次のように変更できます:
public static T Method<T,U>() where T : ClassA<U> where U : T
それはまったく役に立ちますか?もちろんMethodを変更できない場合はあまり使いません...
他のヒント
いいえ。このメソッドを変更またはラップする必要があります。
理由は次のとおりです。
ClassCはClassBを継承し、ClassBはClassA(ClassB)を継承します
ClassCはClassA(ClassC)から継承しません
ClassBの子はClassA(子クラス)から継承しません。ClassBは代わりにClassBから継承し、ClassBはClassA(子クラス)から継承しません。
ほとんどの場合、ベースの非ジェネリック抽象クラスを使用することで、このシナリオを解決できます。
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;
}
ただし、走行距離は異なる場合があります。