|
|
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
Как лучше решить проблему циклических зависимостей классов? Например, есть многопользовательская игра. Такие классы: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Разумеется, оба класса записаны в разных модулях. При выводе изображения объект класса TUnit обращается к объекту TPlayer для получения цвета игрока (имени или любого другого параметра, относящегося непосредственно к игроку). Это создает циклическую зависимость: в разделе uses одного модуля вызывается другой, и наоборот. Есть советы по решению этой проблемы, описанные в интернете: описывать все классы в одном модуле, вынести необходимые поля в интерфейсы, воспользоваться помощниками, наследоваться от одного родительского класса и делать приведение типов и т.д. Есть, также, совет "изменить структуру программы, потому что ссылка на родителя - плохой тон". Интересует именно этот совет: неужели, всегда можно красиво и правильно разорвать эту циклическую зависимость? В моем примере выше, дублировать поле "color" (и любые другие требуемые поля) в классе TUnit было бы неправильно. Каким образом правильно (с точки зрения структуры) разорвать эту циклическую зависимость (либо, просто решить проблему)? Наверняка, многие с этим сталкивались. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 13:03 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
fckrИнтересует именно этот совет: неужели, всегда можно красиво и правильно разорвать эту циклическую зависимость? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 13:07 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
fckr, Ты можешь выделить интерфейсы обоих классов и вынести их в один (третий) юнит, а реализацию интерфейсов и обращение друг к другу через вынесенные интерфейсы в разных юнитах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 13:21 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
Возможно, будет интересно: "Дружественность" в Delphi ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 13:40 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
fckrЕсть, также, совет "изменить структуру программы, потому что ссылка на родителя - плохой тон". Интересует именно этот совет: неужели, всегда можно красиво и правильно разорвать эту циклическую зависимость? Не всегда, но в большинстве случаев это удаётся правильным дизайном иерархии классов и их взаимодействия. В твоём случае достаточно убрать из TPlayer список его юнитов, поскольку удобнее иметь один общий список юнитов в игровом мире. Возможно, сгруппированный по владельцам, которыми могут быть не только игроки, но и NPC, например. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 14:17 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
В какой это вселенной ссылка на родителя - плохой тон? По твоему конкретному случаю: я бы выделил отдельный тип TPlayerProps, которые нужны юниту от плеера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 16:50 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
fckr Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Можно вынести эти два класса на абстрактном уровне в свои модули. В других-же модулях их реализовать с любыми ссылками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 16:54 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
Эта задача про Корзину с яблоками. На корзине написано, сколько и каких яблок в ней лежат, а на яблоках - в какой корзине они лежат DimonkaТы можешь выделить интерфейсы Да. Но если далее работать с объектами через интерфейс, то получается, что яблоки всегда ссылаются на корзину, а корзина - на яблоки. т.е. объекты ссылаются сами на себя и освобождения интерфейса не произойдёт. Микрософт подумала, и решила эту проблему созданием среды .NET :) На Delphi можно сделать так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Но я бы лучше подумал на сколько это целесообразно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2018, 11:36 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
Valery_BНа Delphi можно сделать так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Но я бы лучше подумал на сколько это целесообразно. У него трабл в том, что плеер и юнит в разных модулях. Все же настаиваю на выделении типа свойств плеера. Так юнит будет брать только то, что ему необходимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2018, 11:49 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
fckrЕсть, также, совет "изменить структуру программы, потому что ссылка на родителя - плохой тон". Интересует именно этот совет: неужели, всегда можно красиво и правильно разорвать эту циклическую зависимость? советчиков полно, а пилить вам у меня вот другое мнение, пока в языке не реализовали параллельное наследование классов, и не платят за разгребание гемороев я буду писать как проще и работает. у меня есть два простых совета: собрать зависимые объекты в один модуль и не париться с глупостями для автоматизации сделать генерики владетель-владеемый в отдельном модуле и уже от их конкретной специализации наследоваться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2018, 12:38 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)советчиков полно kealon(Ruslan)у меня есть два простых совета: Во, теперь их стало на одного больше ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2018, 13:29 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
Еще вариант Код: pascal 1. 2. 3. 4. заменить на Код: pascal 1. 2. 3. 4. И где надо делать приведение типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2018, 13:40 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
Valery_BЭта задача про Корзину с яблоками. На корзине написано, сколько и каких яблок в ней лежат, а на яблоках - в какой корзине они лежат DimonkaТы можешь выделить интерфейсы Да. Но если далее работать с объектами через интерфейс, то получается, что яблоки всегда ссылаются на корзину, а корзина - на яблоки. т.е. объекты ссылаются сами на себя и освобождения интерфейса не произойдёт. Код: pascal 1. не предлагать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2018, 14:27 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
Квейд, много народу под ARC пишет? можно вообще забить на такие глупости ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2018, 14:29 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
Слабость ссылки можно сэмулировать через присвоение Вместо: Код: pascal 1. 2. 3. 4. прописать Код: pascal 1. Важно только понимать кто должен освободиться раньше, а кто позже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2018, 16:04 |
|
||
|
Циклическая зависимость классов
|
|||
|---|---|---|---|
|
#18+
Valery_BЭта задача про Корзину с яблоками. На корзине написано, сколько и каких яблок в ней лежат, а на яблоках - в какой корзине они лежат DimonkaТы можешь выделить интерфейсы Да. Но если далее работать с объектами через интерфейс, то получается, что яблоки всегда ссылаются на корзину, а корзина - на яблоки. т.е. объекты ссылаются сами на себя и освобождения интерфейса не произойдёт. Говоря об интерфейсах, я имел обобщённое значение слова интерфейс. Имелось ввиду абстрактное декларирование функций и свойств классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2018, 16:24 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39732939&tid=2040127]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 329ms |

| 0 / 0 |
