1

3 つのクラスがあり、すべて 1 つの基本クラス 'A' から継承されているため、A1、A2、A3 と呼びます。「B」から継承された別の 3 つのクラスは、B1、B2、B3 と呼ばれます。次のように、同じ作業を行う 3 つのメソッドを作成しました。

List<A1> Do(List<B1>);
List<A2> Do(List<B2>); 
List<A3> Do(List<B3>);

ロジックとコードは同じですが、唯一の違いは、3 つのクラスの新しいメソッドが異なることです。

B1 b = new B1(...) in method 1
B2 b = new B2(...)  in method 2 
B3 b = new B3(...)  in method 3.

では、これらの 3 つのメソッドから 1 つのメソッドを一般化する方法を理解するのを手伝ってくれる人はいますか?

B1 コンストラクターについて何かを追加する必要があります。いくつかのコンストラクターを使用したため、状況はより複雑になります。一部は次のようになります。

B1(A1, int)

そして、いくつかは次のようなものです:

B1(A1) 
4

2 に答える 2

1

それはすべて、Bxコンストラクターがどのように見えるかによって異なります。私の最初の推測は

public List<TOutput> Do<TInput, TOutput>(
    List<TInput> input, 
    Func<..., TOutput> outputCreator)

その後

var a1 = Do(b1, (...) => new B1(...));

したがって、ここでの主な問題は、...部品がどうあるべきかということです。

于 2013-03-18T08:48:20.473 に答える
0

次のように、デリゲートをメソッドに渡して、作成されるオブジェクトの正確なタイプを決定できます。

List<AX> Do<AX,BX>(List<BX> b, Func<AX,int?,BX> make) where AX : A, BX : B {
    ...
}

make次のように、パラメーターにラムダを渡すことができます。

var listB2 = new List<B2>();
var res = Do(listB2, (a, num) => num.HasValue ? new B2(a, num.Value) : B2(a));
于 2013-03-18T08:49:44.417 に答える