2

これは前の質問へのフォローアップです。その質問には間違いがありました (私が探しているより良い解決策ではなく、現在の解決策を実際に投稿しました)。

私は3つのクラス、、、を持ってParentClassClassAますClassBClassAとはどちらClassBも のサブクラスですParentClass。タイプのオブジェクトを作成するClassAClassB、ある種の列挙を使用してタイプを識別し、オブジェクトキャストを親タイプとしてインスタンス化します。どうすればそれを動的に行うことができますか? 以下のコードと、 と書かれている部分を見てください//what do I put here?。読んでくれてありがとう!

public enum ClassType { ClassA, ClassB };

public abstract class ParentClass
{
    public static readonly Dictionary<ClassType, Type> Types = 
        new Dictionary<ClassType, Type>{
            {ClassType.ClassA, typeof(ClassA) },
            {ClassType.ClassB, typeof(ClassB) }
        };

    public ParentClass()
    {
        //....
    }

    public static ParentClass GetNewObjectOfType(ClassType type)
    {
        //What do I put here?
    }
}

public class ClassA:ParentClass
{
    //....
}
public class ClassB:ParentClass
{
    //.......
}
4

3 に答える 3

2

Activator特にコンストラクターへの引数がない場合は、クラスを使用して簡単に行うことができます。

return Activator.CreateInstance(Types[type]);

于 2013-02-20T23:15:47.537 に答える
2

質問を言い換えると、静的ファクトリ メソッドのコーディング方法に関するアドバイスを探しています。

これを達成するために個別の列挙は必要ないと思います。これは私が一緒に投げたLINQPadスクリプトです(編集:静的定数を追加し、それらを使用してデモを作成しました)

void Main()
{
    var a = ParentClass.Create(typeof(ClassA));
    var b = ParentClass.Create(typeof(ClassB));
    var c = ParentClass.Create(ParentClass.ClassAType);
    a.Dump();
    b.Dump();
    c.Dump();
}


public abstract class ParentClass
{
    public static readonly Type ClassAType = typeof(ClassA); 
    public static readonly Type ClassBType = typeof(ClassB);
    public string SomeProp { get; set; }
    protected ParentClass() {}

    public static ParentClass Create(Type typeToCreate)
    {
        // validate that type is derived from ParentClass
        return (ParentClass)Activator.CreateInstance(typeToCreate);
    }
}

public class ClassA:ParentClass {
    public ClassA()
    {
        SomeProp = "ClassA~";
    }

}
public class ClassB:ParentClass
{
    public ClassB()
    {
        SomeProp = "ClassB~";
    }
}
于 2013-02-20T23:22:28.680 に答える
1

前の質問で述べたように:

リフレクションは遅く、必要のない場所でよく使用されます

Activator.CreateInstance はリフレクションを使用して、パラメーターのないコンストラクターを追跡します。この問題を解決するには - それは必要ありません。親クラスは、作成を担当するすべての型をすでに認識しています。


静的ファクトリ メソッドを使用する理由の 1 つは、かなりの作業、または子クラスの作成に関連するさまざまな種類の作業がある可能性があることです。マップを強化すると、静的ファクトリのコーディングが簡単になると思います。

public static readonly Dictionary<ClassType, Func<ParentClass>> Types = 
    new Dictionary<ClassType, Func<ParentClass>>{
        {ClassType.ClassA, () => new ClassA(1, 2, 3) },
        {ClassType.ClassB, () => new ClassB("1") }
    };


public static ParentClass GetNewObjectOfType(ClassType type)
{
    Func<ParentClass> maker = Types[type];
    ParentClass result = maker();
    return result;
}
于 2013-02-20T23:31:01.097 に答える