C#:基本クラスの静的メソッドから派生オブジェクトタイプを決定する
-
08-07-2019 - |
質問
C#プログラムでは、静的な" Create"を持つ抽象基本クラスがあります。方法。 Createメソッドは、クラスのインスタンスを作成し、後で使用するためにローカルに保存するために使用されます。基本クラスは抽象であるため、実装オブジェクトは常にそれから派生します。
基本クラスからオブジェクトを派生させ、派生クラスを通じて静的Createメソッド(基本クラスで1回実装)を呼び出し、派生オブジェクトのインスタンスを作成できるようにします。
これを実行できるC#言語内の機能はありますか。私の現在のフォールバック位置は、派生クラスのインスタンスを引数の1つとしてCreate関数に渡すことです。つまり、
objDerived.Create(new objDerived(), "Arg1", "Arg2");
解決
ジェネリックを使用して試してください:
public static BaseClass Create<T>() where T : BaseClass, new()
{
T newVar = new T();
// Do something with newVar
return T;
}
使用例:
DerivedClass d = BaseClass.Create<DerivedClass>();
他のヒント
概要
2つの主なオプションがあります。より良くて新しいものはジェネリックを使用することであり、もう1つはリフレクションを使用することです。 .NET 2.0より前に機能するソリューションを開発する必要がある場合に備えて、両方を提供しています。
ジェネリック
abstract class BaseClass
{
public static BaseClass Create<T>() where T : BaseClass, new()
{
return new T();
}
}
使用方法:
DerivedClass derivedInstance = BaseClass.Create<DerivedClass>();
反射
abstract class BaseClass
{
public static BaseClass Create(Type derivedType)
{
// Cast will throw at runtime if the created class
// doesn't derive from BaseClass.
return (BaseClass)Activator.CreateInstance(derivedType);
}
}
使用方法は次のとおりです(読みやすいように2行に分割します):
DerivedClass derivedClass
= (DerivedClass)BaseClass.Create(typeof(DerivedClass));
抽象基本クラスの静的ファクトリメソッドを使用して、派生の別のインスタンス内から派生の新しいインスタンスを作成しますか?もしそうなら、なぜだろう...しかし...
public abstract class MyBase
{
public static T GetNewDerived<T>() where T : MyBase, new()
{
return new T();
}
}
public class DerivedA : MyBase
{
public static DerivedA GetNewDerived()
{
return GetNewDerived<DerivedA>();
}
}
public class DerivedB : MyBase
{
public static DerivedB GetNewDerived()
{
return GetNewDerived<DerivedB>();
}
}
これはあなたが望むものですか?
Create()メソッドを抽象化する必要があるように聞こえます。そして、それを行うと、名前を変更してコンストラクターにすることもできます。その後、必要に応じてオブジェクトの構築後に呼び出す別のInit()メソッドを使用できます。通常のポリモーフィズム効果が処理します。
外部情報なしではできません。派生クラスのタイプ、そのインスタンス、または派生クラスの完全修飾名。これらのいずれも、すでに実行していることと同等です。私が知っているより良い解決策はありません。静的メソッドの性質上、これ以上エレガントなものはありません。
あなたの設計目標が何であるかはわかりませんが、あなたが尋ねたところから、それは多くのコードの匂いがするかもしれないように聞こえます。 Microsoft Unity、Castle Windsor、StructureMap、Ninject、Spring.Netなどの多くのフレームワークに実装されているInversion of Control(IoC)/ Dependency Injection(DI)設計パターンを実際に検討する必要があると思います。
IoCコンテナの使用を見れば、問題はよりクリーンで疎結合の方法で解決されると思います。