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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д