Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 208
1

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

21.01.2015, 21:16. Показов 1186. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, имеются объекты класса Element<S,E>, которые хранятся и обрабатываются в экземплярах класса ElementSystem<S, E>. При создании Element нужно сразу добавить его в ElementSystem. Мне хотелось что бы это действие совершалось минимумом кода, поэтому решил просто передавать в конструктор Element объект с коллекцией систем, а он бы уже сделал все остальное.
Но меня смущает что типы S,E классов Element и ElementSystem ссылаются друг на друга. Скажите это допустимо?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)];
        }
}
C#
1
2
3
4
5
class WaterElement : Element<WaterSystem, WaterElement>{...}
class WaterSystem: ElementSystem<WaterSystem, WaterElement>{...}
...
 
var water = new WaterElement(World); // удобно же!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2015, 21:16
Ответы с готовыми решениями:

Имеет ли право на жизнь?
Сделано на CMS Slaed Специфичный ресурс! Коротко - каталог позволяет пользователям добавлять...

Таблицы ссылаются друг на друга
Добрый день возник вопрос, как правильно организовать привязку таблиц между собой. Есть таблица...

Такая сборка имеет право на жизнь ?
Мат. плата MSI B75A-G41 Процессор Intel® Core™ i5-3330 OEM Память DDR3 4Gb (pc-12800) 1600MHz ...

Блок схема имеет право на жизнь?
Здравствуйте, уважаемые форумчане. Подскажите, плиз, Данная блок-схема имеет право на жизнь?...

8
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
21.01.2015, 22:38 2
Цитата Сообщение от PlutDem Посмотреть сообщение
Но меня смущает что типы S,E классов Element и ElementSystem ссылаются друг на друга. Скажите это допустимо?
А вы пробовали объявить класс Element или ElementSystem ?
0
Эксперт .NETАвтор FAQ
10413 / 5143 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.01.2015, 23:01 3
Семантика жутко перегружена.
Объясните словами что за система и что вы пытаетесь реализовать.
И да, KISS
1
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
21.01.2015, 23:25 4
Storm23, это тоже ничего)))
http://habrahabr.ru/post/153225/
0
Storm23
21.01.2015, 23:52
  #5

Не по теме:

insite2012, Там тоже шедеврально, но по кр мере там нет рекурсии типов, как здесь :)

0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2015, 00:01 6
insite2012, когда меня спрашивают про испекание хлеба, я всегда ссылаюсь на эту статью. Nooooot so fast

Добавлено через 40 секунд
PlutDem, допустимо, но костыльно. Косяк в архитектуре очевидно есть
0
2 / 2 / 2
Регистрация: 23.02.2012
Сообщений: 208
22.01.2015, 00:11  [ТС] 7
Цитата Сообщение от Storm23 Посмотреть сообщение
Объясните словами что за система и что вы пытаетесь реализовать.
Нечто вроде entity component system. В системах находится логика (алгоритмы) в компонентах - только данные. Каждую итерацию все системы обновляются. Каждая система работает с приписанным ей типом компонентов. Что бы не прописывать базовый функционал (добавить/удалить компонент из системы, коллекция для хранения и т.д) я решил его реализовать в Element<S,E> и ElementSystem<S, E>.
Цитата Сообщение от Storm23 Посмотреть сообщение
И да, KISS
А простоте чего должно отдаваться предпочтение?
Можно упростить классы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public abstract class Element
{
}
 
public abstract class ElementSystem<E> : ISystem where E : Element
{
    public HashSet<E> Elements = new HashSet<E>();
    public E Add(E element)
    {
        Elements.Add(element);
        return element;
    }
}
class WaterElement : Element{...}
class WaterSystem: ElementSystem<WaterElement>{...}
И создавать новый компонент так:
C#
1
World.Get<WaterSystem>.Add(new WaterElement())
Или оставить все как есть ради более короткого варианта:
C#
1
new WaterElement(World);
Последний вариант мне нравится больше, но может я уже занес ногу над граблями?
Цитата Сообщение от maxillion Посмотреть сообщение
А вы пробовали объявить класс Element или ElementSystem ?
Если честно, я совершенно не понял сути вопроса. Перефразируйте, пожалуйста.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2015, 00:25 8
PlutDem, вообще, чем меньше зависимостей, тем лучше. В идеале 100% зависимостей между интерфейсами. То есть интерфейсы знают друг про друга, но
а) без циклов. Если интерфейс А знает о Б, то Б не должен знать об А.
б) количество связей должно быть сведено к минимуму, и они не должны ссылаться ни на один класс, а только на другие интерфейсы.

это идеал. К нему полезно стремиться, но достигнуть вряд ли выйдет, и из-за этого не надо расстраиваться.

А пока непонятно, чего вы хотите добиться

Кстати, типичная архитектура выглядит какнибудь так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    public static class MyManager
    {
        public static MyExampleInterface GetSomeNestedInterface(SomeNestedInterface nested)
        {
            return new MyExample {SomeNested = nested};
        }
    }
 
    public abstract class MyExampleInterface
    {
        public SomeNestedInterface SomeNested { get; set; }
 
        public void Foo()
        {
            Console.WriteLine(SomeNested);
        }
    }
 
    public abstract class SomeNestedInterface
    {
        
    }
 
    public class MyExample : MyExampleInterface
    {
        
    }
 
    public class SomeNested : SomeNestedInterface
    {
        
    }
Миниатюры
Generic классы, типы которых, ссылаются друг на друга. Идея имеет право на жизнь?  
0
Эксперт .NETАвтор FAQ
10413 / 5143 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.01.2015, 00:33 9
Цитата Сообщение от PlutDem Посмотреть сообщение
И создавать новый компонент так:
Код C#
1
World.Get<WaterSystem>.Add(new WaterElement())
Если уж у вас там все строго по шаблонам, то это вообще должно выглядеть вот так:

C#
1
2
3
4
5
6
7
8
9
class Factory
{
  Element CreateElement()
  {
       var elem = new WaterElement();
       World.Get<WaterSystem>.Add(elem);
       return elem;
  }
}
А переусложнять структуру типов ради сомнительного синтаксического сахара - очень плохая затея, ИМХО.
0
22.01.2015, 00:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2015, 00:33
Помогаю со студенческими работами здесь

Такая нейросеть имеет право на жизнь?
Приветствую. Обратился ко мне товарищь с просьбой сделать нейронную сеть, чтобы она обучалась для...

Имеет ли право на жизнь такая авторизация?
Приветствую вас, дорогие товарищи форумчане! От вас хотелось бы услышать конструктивной критики и...

Имеет ли право на жизнь такой стиль программирования?
Почти никогда не пишу с чистого листа, с нуля, т.е. не создаю программу/процедуру и тд с нуля...

Кому не лень можете проверить имеет ли этот проект право на "жизнь"
Нужно было разделить фай 450к строчек на файлы по 10к строк .. вот такое решение пришло первое в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru