Обновление : В ответ на ваши изменения:
Тогда я бы дал SimpleNavigation и AdvancedNavigation имя "навигация", а системе SensorS - имя "сенсор"
Если это так, то вы действительно не можете надеяться на такой интерфейс ...
public T GetComponent<T>() where T : GameComponent { }
..., потому что несколько типов объектов GameComponent
могут совместно использоватьсяодно и то же имяТаким образом, вы не можете вывести имя из типа.
Почему бы не использовать вместо enum
?Тогда у вас может быть что-то вроде этого:
public enum ComponentType
{
Navigation,
Sensor // etc.
}
И ваш класс GameObject
может в свою очередь содержать Dictionary<ComponentType, GameComponent>
.
Тогда ваш GetComponent
методможет выглядеть так:
GameComponent GetComponent(ComponentType type) { }
В любом случае, это мысль ...
Я думаю, что имеет больше смысла, это:
Во-первых, если выищите по имени, используйте Dictionary<string, GameComponent>
вместо List<GameComponent>
.Это даст вам O (1) время поиска вместо O (N).
Теперь, если вы хотите, чтобы имя зависело от типа, определите свой класс GameComponent
следующим образом:
class GameComponent
{
public virtual string Name
{
// You could also hard-code this or cache it
// for better performance.
get { return this.GetType().Name; }
}
}
Затем вы можете переопределить свойство Name
в ваших производных методах, например:
class NavigationComponent : GameComponent
{
public override string Name
{
// This returns the same thing as GetType().Name,
// but it's faster.
get { return "NavigationComponent"; }
}
}
Тогда ваш метод AddComponent
будет иметь вид:
public void AddComponent(GameComponent component)
{
_components.Add(component.Name, component);
}
иВаш GetComponent
метод будет простым:
public T GetComponent<T>() where T : GameComponent
{
return _components[typeof(T).Name] as T;
}