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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы