从字符串实例化继承的类
本文关键字:继承 实例化 字符串 | 更新日期: 2023-09-27 18:01:08
我想知道是否有一种简单的方法来实例化继承的对象(知道类名(。
假设我有
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);
}
}
但我认为这将是糟糕的编程,而且根本不可扩展。
您可以使用工厂方法来实例化monster子类。
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类的一个私有静态字段中。这样,您只使用反射一次。在任何情况下,上述代码都可以这样使用:
Monster cat = Monster.CreateMonster("Cat");