5

C# プログラムには、静的な "Create" メソッドを持つ抽象基本クラスがあります。Create メソッドは、クラスのインスタンスを作成し、後で使用するためにローカルに保存するために使用されます。基本クラスは抽象クラスであるため、実装オブジェクトは常にそこから派生します。

基本クラスからオブジェクトを派生させ、派生クラスを介して静的な Create メソッド (基本クラスで 1 回実装) を呼び出し、派生オブジェクトのインスタンスを作成できるようにしたいと考えています。

私がこれをやってのけることを可能にするC#言語内の機能はありますか?私の現在のフォールバックの立場は、派生クラスのインスタンスを引数の 1 つとして Create 関数に渡すことです。つまり、次のようになります。

objDerived.Create(new objDerived(), "Arg1", "Arg2");
4

6 に答える 6

12

ジェネリックを使用してみてください:

public static BaseClass Create<T>() where T : BaseClass, new()
{
    T newVar = new T();
    // Do something with newVar
    return T;
}

サンプル使用:

DerivedClass d = BaseClass.Create<DerivedClass>();
于 2008-11-18T21:35:15.183 に答える
5

概要

主なオプションは 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));
于 2008-11-18T22:17:46.253 に答える
4

抽象基本クラスの静的ファクトリメソッドを使用して、派生の別のインスタンス内から派生の新しいインスタンスを作成しますか?もしそうなら、私はなぜだろうか...しかし...

 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>();
    }
 }     

これは、あなたの望むことですか ?

于 2008-11-18T21:46:42.540 に答える
3

Create() メソッドを抽象化する必要があるようです。そして、それを行ったら、名前を変更してコンストラクターにすることもできます。次に、必要に応じて、オブジェクトの構築後に別の Init() メソッドを呼び出すことができ、通常のポリモーフィズム効果で処理されます。

于 2008-11-18T21:24:53.910 に答える
1

外部からの情報がなければそれはできません。派生クラスの型、そのインスタンス、または派生クラスの完全修飾名のいずれかです。これらはどれも、すでに行っていることと同等です。私が知っているより良い解決策はありません。静的メソッドの本質は、よりエレガントなものを排除します。

于 2008-11-18T21:22:46.143 に答える
0

あなたの設計目標が何であるかはわかりませんが、あなたが尋ねたところによると、多くのコードの臭いがする可能性があるようです. Microsoft Unity、Castle Windsor、StructureMap、Ninject、Spring.Net などの多数のフレームワークに実装されている Inversion of Control(IoC) / Dependency Injection (DI) 設計パターンを実際に検討する必要があると思います。

IoC コンテナーの使用を検討すると、問題がよりクリーンで疎結合の方法で解決されると思います。

于 2008-11-18T21:50:27.057 に答える