2016-11-18 37 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

真棒,谢谢,类型名称对应于机器生成的电子表格中的字段中的条目,所以可能是最简单的方式并且应该足够一致。 –

相关问题