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;
}
}