2016-11-18 68 views
1

對於可怕的標題的道歉,我想不出一個更好的方式來描述它。在抽象基的構造函數中創建新的派生類型

本質上,我有一個抽象基類Category和從中繼承的派生類的整個主機。是否有可能做線沿線的東西:

List<Category> catList = new List<Category>(); 
catList.Add(new Category(myCategoryTypeString)); 

myCategoryTypeString將永遠是一個派生類的名稱,有它,而不是創建一個派生類的新對象(可能使用的開關字符串來確定使用哪個類)。

這樣的東西沿着線:

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

將增加Engineering : Category類型的新對象添加到列表?

如果這是可能的,人們會怎麼做呢?我的抽象類定義正是如此:

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

真棒,謝謝,類型名稱對應於機器生成的電子表格中的字段中的條目,所以可能是最簡單的方式並且應該足夠一致。 –

相關問題