2016-11-18 18 views
1

ひどいタイトルに対する謝罪、私はそれをフレーズするより良い方法を考えることができませんでした。抽象基底のコンストラクタで新しい派生型を作成する

私は基本的に抽象基本クラスCategoryを持っており、それから継承した派生クラスのホスト全体があります。線に沿って何かをすることが可能です:

myCategoryTypeStringは常に派生クラスのいずれかの名前で、それは代わりにその派生クラスの新しいオブジェクトを作成する必要があります
List<Category> catList = new List<Category>(); 
catList.Add(new Category(myCategoryTypeString)); 

(おそらく上のスイッチを使用してどのクラスを使用するかを決定する文字列)。

の線に沿って何かようにするには:

catList.Add(new Category("Engineering")); 

リストにEngineering : Category型の新しいオブジェクトを追加しますか?

これが可能であれば、これをどうやって行うのですか?私の抽象クラスが定義されてthusly:

abstract class Category 
{ 
    private string line; 
    private bool ToChallenge; 
    private string[] columns; 
    private int oppLevel; 

    protected Category(string line) 
    { 
     this.line = line; 
     columns = line.Split(','); 
    } 

    public abstract bool IsAnomoly(); 
    public abstract void CategoriseAnomoly(); 
    public abstract void WriteLine(); 

} 
+3

などがありますが、あなたのアプローチはコードの臭いを示しています。ここでレイトバインディングのアプローチを使用してもよろしいですか?コンパイル時のチェックのメリットが失われ、エラーが発生する可能性があります。 –

+0

私が正直であれば完全に必要なわけではありませんが、何よりも可能なのかどうか疑問に思っていました –

+0

これはあまり速く閉じてはいけません。私は、 "文字列をクラス名に変換する"とは関係のないジェネリックのソリューションがあることを確かめています。 – Udontknow

答えて

5

をいいえ、あなたはそれを行うことはできません - あなたはnew Foo()を呼び出す場合、常にFooの、決してサブクラスのインスタンスを作成すること。代わりに

Categoryに静的なファクトリメソッドを作成します。これはすでに機械生成出力されない限り、

public static Category CreateCategory(string line) 
{ 
    if (line == "Engineering") 
    { 
     return new EngineeringCategory(); 
    } 
    // Whatever you want to do for non-engineering categories 
} 

をコメントで述べたように、おそらく実際の型の名前を使用して、素晴らしいアイデアではありません。本当にしたい場合は、

public static Category CreateCategory(string typeName) 
{ 
    // Note that the type name would have to be namespace-qualified here 
    Type type = Type.GetType(typeName); 
    return (Category) Activator.CreateInstance(type); 
} 
+0

それはトリックを行う必要があります、ありがとう。 –

+0

@JamesHughes:詳細は私の編集を見てください。 –

+0

恐縮です、ありがとう、タイプ名はマシンで生成されたスプレッドシートのフィールドのエントリに対応しているので、おそらく最も簡単な方法であり、一貫性があるはずです。 –

関連する問題