Generic классы, типы которых, ссылаются друг на друга. Идея имеет право на жизнь? - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, имеются объекты класса Element<S,E>, которые хранятся и обрабатываются в экземплярах класса ElementSystem<S, E>. При создании Element нужно сразу добавить его в ElementSystem. Мне хотелось что бы это действие совершалось минимумом кода, поэтому решил просто передавать в конструктор Element объект с коллекцией систем, а он бы уже сделал все остальное. Но меня смущает что типы S,E классов Element и ElementSystem ссылаются друг на друга. Скажите это допустимо?
Листинг программы
  1. public abstract class Element<S,E> : IElement where S : ElementSystem<S, E> where E : Element<S, E>
  2. {
  3. public Element(World world)
  4. {
  5. world.Get<S>().Add((E)this);
  6. }
  7. }
  8. public abstract class ElementSystem<S, E> : ISystem where E : Element<S, E> where S : ElementSystem<S, E>
  9. {
  10. public HashSet<E> Elements = new HashSet<E>();
  11. public E Add(E element)
  12. {
  13. Elements.Add(element);
  14. return element;
  15. }
  16. }
  17. class World{
  18. public Dictionary<Type, ISystem> Systems = new Dictionary<Type, ISystem>();
  19. public T Get<T>() where T : ISystem
  20. {
  21. return (T)Systems[typeof (T)];
  22. }
  23. }
Листинг программы
  1. class WaterElement : Element<WaterSystem, WaterElement>{...}
  2. class WaterSystem: ElementSystem<WaterSystem, WaterElement>{...}
  3. ...
  4. var water = new WaterElement(World); // удобно же!

Решение задачи: «Generic классы, типы которых, ссылаются друг на друга. Идея имеет право на жизнь?»

textual
Листинг программы
  1. class Factory
  2. {
  3.   Element CreateElement()
  4.   {
  5.        var elem = new WaterElement();
  6.        World.Get<WaterSystem>.Add(elem);
  7.        return elem;
  8.   }
  9. }

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


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

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

7   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы