Итак, у меня есть базовый набор абстрактных классов с использованием пространства имен BaseEngine, и настоящий игровой проект, получающий набор.В C#, как у вас есть глобальный универсальный класс?
Есть много базовых классов, которые имеют набор абстрактных методов и предопределенных методов, таких как: Предмет, сущность, мастерство
public abstract class Item
{
public string name;
public void DestroyItemInBaseEngine()
{
// bunch of codes
}
public abstract void BakeItemTheWayYouWant();
}
public abstract class SkillManager
{
public abstract T InteractItemWithSkill<T> (T item)
where T:Item, new(); //not sure if this particular line is valid, but this was written just to help you understand
}
И происходящие классы, такие как:
public class GameItem : Item
{
public int variableSpecificToThisGameProject;
// and other implementation for this specific game...
}
Теперь, В BaseEngine у него были бы абстрактные классы, которые ссылаются на Item несколько раз на таких менеджеров, как BaseItemManager. Каждая игра управлялась бы по-разному, чтобы эти менеджеры также были получены. Когда конкретный игровой проект получает BaseItemManager, ему придется использовать GameItem.
BaseEngine был создан для использования с различными проектами, в основном набором абстрактных классов.
Каждый раз, когда эти производные объекты именуются в проекте игры, вы должны либо бросить его, или использовать общий тип в абстрактных методов, таких как, например:
if (ValidateItemObject<GameItem> (GameItem item) != null)
// do something with it
Итак, потому что GameItem и другие типы решили во время компиляции все равно нужно объявить что-то вроде T = GameItem, S = GameSkill для всего проекта, поэтому нам не нужно упоминать каждый раз, когда вызываются связанные методы (например, выше) или классы?
Я попытался изо всех сил сделать мое дело максимально ясным, но дайте мне знать, если не ясно, что я пытаюсь сделать.
EDIT:
protected abstract T ConvertTableToItem<T> (T item, LuaTable luaTable) where T:BaseItem;
protected override ProjectItem SetItemAPI<ProjectItem> (ProjectItem newItem, LuaTable luaTable)
{
newItem.desc = "test";
}
Это не будет работать говоря убывание не является членом класса. Я могу гарантировать, что это так. desc (public string desc) определяется в ProjectItem.
ProjectItem - производный класс BaseItem.
Итак, вы устали от того, что у вас есть 'ValidateItemObject (item)' и скорее всего хотите получить псевдоним проекта, такой как 'ValidateGameItem (item)'? Btw Я думаю 'if (ValidateItemObject (элемент GameItem)! = Null)' недопустимый синтаксис. –
bokibeg
Да! Например, глобальный тип псевдонима, так сказать. Причина не в том, что я просто устал, но некоторым BaseEngineManager придется ссылаться на объекты, подобные GameItem, и управлять ими. Например, BaseItemManager имеет словарь (где T будет GameItem), а BaseSkillManager будет пытаться использовать что-то вроде «BaseItemManager .dictionary.ContainsKey (itemID)», но на момент написания базового кода, поскольку BaseEngine предназначенный для будущих проектов, мы не знаем, что GameItem существует. –