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

标签 c# inheritance

<分区>

为这个糟糕的标题道歉,我想不出更好的措辞方式。

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

关于c# - 在抽象基的构造函数中创建新的派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40679139/

相关文章:

c# - 更改图像源属性时崩溃

c# - WPF RichTextBox 获取字符矩形

c# - 仅允许在 C# 中父类(super class)的程序集上实例化子类

java - 如何从嵌套类访问扩展类的方法?

c# - 如何避免Windows崩溃屏幕

c# - 如果单击周围的元素,则将焦点保留在 TextBox 中

C# Bruteforce - 多线程处理固定长度的密码

java - 跨连接子类问题进行限制条件查询

java - 即使在Java中初始化子类后,静态变量的值也不会改变

PHP - 使用静态方法动态扩展父类