Generic классы, типы которых, ссылаются друг на друга. Идея имеет право на жизнь? - C#
Формулировка задачи:
Здравствуйте, имеются объекты класса Element<S,E>, которые хранятся и обрабатываются в экземплярах класса ElementSystem<S, E>. При создании Element нужно сразу добавить его в ElementSystem. Мне хотелось что бы это действие совершалось минимумом кода, поэтому решил просто передавать в конструктор Element объект с коллекцией систем, а он бы уже сделал все остальное.
Но меня смущает что типы S,E классов Element и ElementSystem ссылаются друг на друга. Скажите это допустимо?
Листинг программы
- public abstract class Element<S,E> : IElement where S : ElementSystem<S, E> where E : Element<S, E>
- {
- public Element(World world)
- {
- world.Get<S>().Add((E)this);
- }
- }
- public abstract class ElementSystem<S, E> : ISystem where E : Element<S, E> where S : ElementSystem<S, E>
- {
- public HashSet<E> Elements = new HashSet<E>();
- public E Add(E element)
- {
- Elements.Add(element);
- return element;
- }
- }
- class World{
- public Dictionary<Type, ISystem> Systems = new Dictionary<Type, ISystem>();
- public T Get<T>() where T : ISystem
- {
- return (T)Systems[typeof (T)];
- }
- }
Листинг программы
- class WaterElement : Element<WaterSystem, WaterElement>{...}
- class WaterSystem: ElementSystem<WaterSystem, WaterElement>{...}
- ...
- var water = new WaterElement(World); // удобно же!
Решение задачи: «Generic классы, типы которых, ссылаются друг на друга. Идея имеет право на жизнь?»
textual
Листинг программы
- class Factory
- {
- Element CreateElement()
- {
- var elem = new WaterElement();
- World.Get<WaterSystem>.Add(elem);
- return elem;
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д