在抽象基的构造函数中创建新的派生类型

本文关键字:派生 类型 创建 构造函数 抽象 | 更新日期: 2023-09-27 18:18:32

很抱歉,我想不出一个更好的表达方式。

本质上,我有一个抽象基类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();
}

在抽象基的构造函数中创建新的派生类型

不,你不能这样做-如果你调用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);
}