c# - 从字符串实例化继承类

标签 c# oop inheritance

我想知道是否有一种简单的方法来实例化继承的对象(知道类名)。

假设我有

public abstract Monster{
    public string name;
    public string specie;
    public Stats baseStats;
    public string imgDir;
}

public Specie1 : Monster{
    public new string specie = "Specie1";
    public new Stats baseStats = {1,2,3,4,5};
    public new imgDir = "dir/specie1.png";
    public Specie1(string n){
        name = n;
    }
}

我的目标是从保存的文件加载怪物,仅使用一种物种进行测试,我执行以下操作:

Monster[0] = new Specie1("foo");

但是如果我有很多物种,有没有办法通用实例化?

例如:

string specie = loadSpecie();
Monster[] = new specie("foo");

我希望有一种方法可以做到这一点,而无需在各处创建大量开关和 if。

我正在考虑创建一个构造函数

Monster(string species,string name){
    if(species == "Specie1"){
        return new Specie1(name);
    }
}

但我认为这将是可怕的编程,而且根本不可扩展。

最佳答案

您可以使用工厂方法来实例化怪物子类。

public abstract Monster
{
    public string name;
    public string specie;
    public Stats baseStats;
    public string imgDir;

    public static Monster CreateMonster(string monster)
    {
        Type[] types = GetTypeInfo().Assembly.GetTypes();
        Type monsterType = types.FirstOrDefault(t => t.Name.ToLower().Equals(monster.ToLower()));

        if (monsterType == null)
            throw new InvalidOperationException("The given monster does not have a Type associated with it.");

        return Activator.CreateInstance(monsterType) as Monster;
    }
}

public class Cat : Monster
{
}

CreateMonster 方法查找当前程序集中的所有类型,并为其找到的第一个类型创建一个实例,该类型的名称与所提供的怪物名称相匹配。您可能希望包含一些逻辑,以便它不会尝试实例化抽象类,并确保该类型实际上是 Monster 的子类。

就我个人而言,我可能会用一个属性来装饰怪物子类,该属性为每个类提供一个友好的名称。我会将属性值保存到文件中,以及第一个具有与怪物名称匹配的属性的类型。我也只会调用一次 GetTypes() 。您应该将结果缓存在 Monster 类的私有(private)静态字段中。这样,您只需使用反射一次。无论如何,上面的代码可以工作并且可以像这样使用:

Monster cat = Monster.CreateMonster("Cat");

关于c# - 从字符串实例化继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31226560/

相关文章:

c# - 在 C# 中将字符串转换为 IInputStream

php - 在函数内部调用对象

ruby - 最佳原则中的原则

java - 包含其他对象的对象的 OOP 最佳实践

c# - 创建像 ASP.NET MVC 3 ViewBag 这样的类?

c# - 如何去除重复的标签页?

java - 创建可在整个android项目中使用的Settings类

java - ArrayList 中子对象的属性和方法不可见

python - SQLAlchemy 中的继承问题

c# - 如何旋转自定义移动标记(图像)GMap