2

現在、次のような小さなオブジェクト階層があります。

public class BaseClass {
    // this class is empty and exists only so the others can extend it and share the
    // same base type
}

public class ChildA : BaseClass {
    public Subject<AssociatedClassA> Results;
}

public class ChildB : BaseClass {
    public Subject<AssociatedClassB> Results;
}

私の設計では、から拡張するすべてのクラスにBaseClass呼び出さSubject<SomeType>Resultsた . Subject基本クラスを構築するときにジェネリック型を提供できるように、結果を基本クラスまたはインターフェイスに移動できる方法があるかどうか疑問に思っています。たとえば、次のようなことができたら最高です。

ChildA<AssociatedClassA> instance = new ChildA<AssociatedClassA>();

または、ChildA と一致するテンプレート パラメーターは実際には 1 つだけである必要があるため、それを作成したときにそれを処理できる場合は、さらに良いことです。

ChildA instance = new ChildA();
// Results is automatically set to Subject<AssociatedClassA>

結果を基本クラスに移動しようとするかのように、これを実装しようとして立ち往生しています。サブジェクトには、必ずしも提供できないテンプレートパラメーターが必要です。2 つ以上の派生クラスが存在する可能性があり、このシステムを拡張する誰かが結果を各子クラスに手動で追加する必要があるという考えは好きではありません。

以下の2つの回答の提案に従うと、Resultsを基本クラスに移動したいという私の願望は解決しますが、BaseClassをメソッドのジェネリックパラメーターとして使用できるようにすることを望んでいたという別の問題に遭遇しました。派生クラスを使用できます。例えば:

 public void ProcessBaseClass(BaseClass base) {
     // base could be ChildA or ChildB here
 }

BaseClass型引数が必要になったため、これは機能しなくなりました。ここで両方の世界を最大限に活用する方法はありますか、それともデザインの選択が原因で行き詰っていますか?

4

2 に答える 2

6

必要に応じて、親をジェネリックにすることができます。

public class BaseClass<T> {
    public Subject<T> Results;
}

public class ChildA : BaseClass<AssociatedClassA> {
}

public class ChildB : BaseClass<AssociatedClassB> {
}
于 2013-06-25T13:33:14.383 に答える
4

基本クラス自体をジェネリックにすることができます。

public class BaseClass<T> {
    public T Results { get; protected set; }
}
于 2013-06-25T13:32:54.927 に答える