|
|
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Добрый день, возникла архитектурная проблема, в упрощенном варианте я нарисовал картинку(см. спойлер): для цитирования, повторяю суть в текстовом виде: Класс “Родитель” содержит базовые Атрибуты и Функционал. Есть N разных “Дополнений”, которые дополняют “Родителя” своими Атрибутами и Функционалом. Важно, что “Дополнения” знают только о “Родителе”, и НЕ знают о других “Дополнениях” Вопрос: Как получить класс “Наследник_XYZ”, который наследуется от “Родителя” и включает “Дополнения” X, Y, Z ? К сожалению, в Delphi нет множественного наследования, поэтому загвоздка в том, как оформлять эти “Дополнения”, чтоб в итоговый “Наследник“ попала бы только 1(общая) копия “Родителя“? Рассматриваются любые варианты: Агрегация, Интерфейсы, Наследование, Примеси, Инклуды ... Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2020, 12:06 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Maxim.K Как получить класс “Наследник_XYZ” Нужно получить ТОЛЬКО X, Y, Z или в получаемом объекте могут быть и другие методы из других дополнений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2020, 12:34 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Получить КЛАСС или все таки ОБЪЕКТ? Итоговый "Наследник" примет форму Объекта, т.е. экземпляра какого-то Класса. А вот "Дополнения" не обязаны быть классами, и могут быть оформлены в каком-то ином виде(если это поможет). _Vasilisk_ Нужно получить ТОЛЬКО X, Y, Z или в получаемом объекте могут быть и другие методы из других дополнений? Строго как на картинке. "Наследник_XYZ" содержит(собирается) из "Родителя" и "Дополнений" X, Y, Z. Все остальные "Дополнения" не должны попасть в "Наследник". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2020, 13:02 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Тогда делаем все на интерфейсах. объявляем интерфейсы Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. реализация Код: pascal 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. конструирование Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. использование Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2020, 14:03 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Тогда делаем все на интерфейсах. Большое спасибо. Очень полезная информация. Но подозреваю, что Вы привели решение более "сложной" задачи, чем я пытаюсь решить(моя вина, что плохо объяснил). Не требуется собирать Объект в рантайме, нужно всего лишь на этапе программирования так объявить(составить) Класс-Наследник, чтоб в рантайме он уже был готов к работе(без дополнительной сборки). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2020, 14:38 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Maxim.K К сожалению, в Delphi нет множественного наследования Лучшее приближение к множественному наследованию, которое есть в Delphi - это директива implements. Решение Вашей задачи выглядит примерно так: Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2020, 15:06 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
softwarer это директива implements. Большое Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2020, 15:14 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
softwarer Maxim.K К сожалению, в Delphi нет множественного наследования Лучшее приближение к множественному наследованию, которое есть в Delphi - это директива implements. Решение Вашей задачи выглядит примерно так: Код: pascal 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. Этот способ противоречит условию задачи Maxim.K загвоздка в том, как оформлять эти “Дополнения”, чтоб в итоговый “Наследник“ попала бы только 1(общая) копия “Родителя“? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 14:29 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. А смешивать объектные и интерфейсные ссылки - это нормально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 14:52 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Uridian Этот способ противоречит условию задачи Неверно. alekcvp А смешивать объектные и интерфейсные ссылки - это нормально? Если понимать, что делаешь, то почему нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 15:01 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
softwarer Неверно. только 1 ( общая ) копия “Родителя“ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 15:19 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Uridian softwarer Неверно. только 1 ( общая ) копия “Родителя“ Только одна общая копия родителя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 15:22 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
softwarer Только одна общая копия родителя. Действительно, копия Родителя одна, поскольку Дополнения не наследуются от Родителя. Но тогда как обстоит с этим: “Дополнения” знают о “Родителе” и дополняют “Родителя” своими Атрибутами и Функционалом? Мне думается, на основании этого, (хотя могу ошибаться), что Дополнения используют базовые Атрибуты и Функционал, или базовые Атрибуты и Функционал включены в Дополнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 16:23 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Uridian Но тогда как обстоит с этим: “Дополнения” знают о “Родителе” Например, ссылка на родителя в дополнении. Uridian и дополняют “Родителя” своими Атрибутами и Функционалом? Потомок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 16:27 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
softwarer Потомок. Потомок (каждое Дополнение) содержит в себе собственную копию родителя, следовательно "Наследник" будет содержать несколько приватных копий. softwarer Например, ссылка на родителя в дополнении. Пожалуй, только это подходит, с уточнением: ссылка на один и тот же экземпляр родителя для всех Дополнений, реализованных в Наследнике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 16:46 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Uridian Потомок (каждое Дополнение) См. выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 16:55 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Maxim.K Добрый день, возникла архитектурная проблема Вот мне всегда было интересно, что же за ИИ^3 вы там пишите... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 17:52 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
alekcvp А смешивать объектные и интерфейсные ссылки - это нормально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2020, 18:11 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Maxim.K _Vasilisk_ Тогда делаем все на интерфейсах. Большое спасибо. Очень полезная информация. Но подозреваю, что Вы привели решение более "сложной" задачи, чем я пытаюсь решить(моя вина, что плохо объяснил). Не требуется собирать Объект в рантайме, нужно всего лишь на этапе программирования так объявить(составить) Класс-Наследник, чтоб в рантайме он уже был готов к работе(без дополнительной сборки). я так понимаю, что вам нужно что бы автоматом все методы объекта-дополнения стали методами класса а зачем? обычная практика просто вынести свойство с "нужным дополнением" и напрямую указывать его вызовы н-р, Form.Canvas.{...} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2020, 07:53 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял задачу, то просто надо объявить в protected группу internal методов и в наследниках просто создавать публичные методы произвольно, используя эти internal методы Код: pascal 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2020, 10:43 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) поддержка интерфейсов и есть множественное наследование в понятии C++ План Путина нужно читать, а не курить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2020, 12:11 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
softwarer kealon(Ruslan) поддержка интерфейсов и есть множественное наследование в понятии C++ План Путина нужно читать, а не курить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2020, 13:17 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
Как сделано - вопрос второй. Первый - какие возможности даёт (или не даёт). Интерфейсы не дают возможностей множественного наследования, соответственно, ставить между ними знак равенства - нелепо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2020, 13:24 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
softwarer, всё оно даёт, правда много чего лишнего делать заставляет, но это уже недостатки конкретной реализации интерфейс - это и есть классический объект, а если от любого класса можно унаследоваться и выдать ссылку на этот объект - а это возможно, значит всё что связано с множественным наследованием - работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2020, 13:33 |
|
||
|
Сделать выбор(Агрегация, Наследование, Интерфейсы, Примеси). Кто сталкивался?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) всё оно даёт, правда много чего лишнего делать заставляет Ну при таком подходе в Fortran IV тоже есть множественное наследование, только с недостатками конкретной реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2020, 13:43 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40005669&tid=2037950]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 342ms |

| 0 / 0 |
