Есть ли способ иметь строку по умолчанию для имен классов в списке наследования - PullRequest
1 голос
/ 30 марта 2020

Не совсем точно, как это сформулировать, но скажите, что у меня есть несколько классов следующим образом

public class Item
{
    string itemPath;
    string prefabID;

    void Initialize()
    {
        itemPath = classnames + prefabID;
    }
}


public class Equippable : Item
public class Weapon : Equippable
public class MeleeWeapon : Weapon

Я бы хотел, чтобы каждая строка заканчивалась своим собственным именем класса, начинающимся с имени базовых классов и имеющим ' / 'между каждым именем.

Просто в надежде сделать это как способ хранения каждого элемента префабного пути

, поэтому мы надеемся, что строка Equippable будет иметь строку

Item / Equippable / prefabID

Оружие будет

Предмет / Экипировка / Оружие / prefabID

и т. д. для каждого производного класса ...

любые предложения или обходные пути о том, как это сделать?

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Попробуйте это:

void Initialize()
{
    var segs = new List<string>();
    var type = GetType();
    while (type != null && type != typeof(object))
    {
        segs.Insert(0, type.Name);
        type = type.BaseType;
    }

    segs.Add(prefabID);

    itemPath = string.Join("/", segs);
}
1 голос
/ 30 марта 2020

Вы можете рекурсивно перебирать все базовые типы и встраивать этот путь в itemPath.

Вот реализация, а ниже вывод.

Я думаю, что поле prefabID будет заполнено позже, так что всякий раз, когда вы вызываете GetPrefabID (), он возвращает itemPath + prefabID.

public class Item
{
    string itemPath;
    string prefabID;

    public string GetPrefabID()
    {
        return itemPath + "/" + prefabID;
    }

    public Item()
    {
        Initialize();
    }

    void Initialize()
    {
        itemPath = GetPrefabPath() + prefabID;
        prefabID = Guid.NewGuid().ToString();
    }

    string GetPrefabPath()
    {
        StringBuilder prefabricatedPath = new StringBuilder(GetType().Name);
        Type baseType = GetType().BaseType;
        while (baseType != typeof(object))
        {
            prefabricatedPath.Insert(0, baseType.Name + "/");
            baseType = baseType.BaseType;
        }
        return prefabricatedPath.ToString();
    }
}


public class Equippable : Item { };
public class Weapon : Equippable { };
public class MeleeWeapon : Weapon { };

static void Main(string[] args)
{
    Console.WriteLine("prefabID for Item: {0}", new Item().GetPrefabID());
    Console.WriteLine("prefabID for Equippable: {0}", new Equippable().GetPrefabID());
    Console.WriteLine("prefabID for Weapon: {0}", new Weapon().GetPrefabID());
    Console.WriteLine("prefabID for MeleeWeapon: {0}", new MeleeWeapon().GetPrefabID());

    Console.ReadLine();
}

Вывод:

prefabID for Item: Item/c4fb4f63-f7f1-4c83-9d01-26881bb5e014
prefabID for Equippable: Item/Equippable/858791ea-d10d-4560-b8e4-202d91625088
prefabID for Weapon: Item/Equippable/Weapon/0bcba546-df85-4fed-ab68-5a1e012df5d
prefabID for MeleeWeapon: Item/Equippable/Weapon/MeleeWeapon/75e60a6d-854a-4d07
b20b-a709699bb3d7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...