3

BaseClass 型のパラメーターを受け取り、戻り値として DerivedClasses を返す 3 つの関数を作成する必要があります。

Public DerivedClass1 SimpleTest1(BaseClass baseType)
{
DerivedClass1 derivedClass1 = new DerivedClass1();
derivedClass1.item = baseType.item;
derivedClass1.itemGroup = baseType.itemGroup;
return derivedClass1;
}

Public DerivedClass2 SimpleTest2(BaseClass baseType)
{
DerivedClass2 derivedClass2 = new DerivedClass2();
derivedClass2.item = baseType.item;
derivedClass2.itemGroup = baseType.itemGroup;
return derivedClass2;
}

Public DerivedClass3 SimpleTest3(BaseClass baseType)
{
DerivedClass3 derivedClass3 = new DerivedClass3();
derivedClass3.item = baseType.item;
derivedClass3.itemGroup = baseType.itemGroup;
return derivedClass3;
}

3 つのメソッドすべてで記述されたコードは同じです。コードを複製せずにこれを達成するためのより良い方法はありますか? ここで適用できる特定の設計パターンはありますか?

4

2 に答える 2

4

これにジェネリックを使用すると、かなりうまく表現できます。

public T SimpleTest<T>(BaseClass baseType) where T : BaseClass, new()
{
    T derived = new T();
    derived.item = baseType.item;
    derived.itemGroup = baseType.itemGroup;
    return derived;
}

デフォルトのコンストラクターを持たなければならないという警告が 1 つあります。そうしないと、これは機能しません。1 つ以上の引数 (ただし、それぞれの署名は同じ) を持つコンストラクターがあるインスタンスでは、dbaseman の回答のように、リフレクションを使用してクラスを動的にインスタンス化できます。

于 2012-06-19T03:09:03.053 に答える
2

これは、ジェネリック関数の適切なアプリケーションのようです...

public T SimpleTest<T>(BaseClass baseType) where T : BaseClass
{
    T derivedClass = Activator.CreateInstance<T>();
    derivedClass.item = baseType.item;
    derivedClass.itemGroup = baseType.itemGroup;
    return derivedClass
}
于 2012-06-19T03:09:08.353 に答える