簡體   English   中英

從字符串實例化繼承的類

[英]Instantiating an Inherited class from a string

我想知道是否有一種簡單的方法來實例化繼承的對象(知道類名)。

假設我有

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");

我希望有一種方法可以在不創建大量開關和ifs的情況下執行此操作。

我在想創建一個構造函數

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方法查找當前程序集中的所有類型,並創建其找到的第一個Type的實例,該實例的名稱與提供的怪物名稱匹配。 您可能希望包括一些邏輯,以便它不嘗試實例化抽象類,並確保該類型實際上是Monster.的子類Monster.

我個人可能會用給每個類起友好名稱的屬性來裝飾怪物子類。 我會將屬性值保存到文件中,並保存到第一個具有與怪物名稱匹配的屬性的Type。 我也只會做一次GetTypes()調用。 您應該將結果緩存在Monster類的私有靜態字段中。 這樣,您只需使用一次反射。 無論如何,上面的代碼都可以工作,並且可以像這樣使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM