|
|
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Вопрос к делфистам. Заранее(до запуска) не известен тип класса(знаем только родителя). А в режиме RunTime выясняется тип класса(у объекта) и нужно создать копию объекта. Вот начало кода, помогите дописать ... Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2019, 17:36 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Maxim.Kздесь д.б. реальный тип объекта aSrc У TObject не так уж и много методов и свойств. Даже полный лентяй способен прочитать описание каждого, включая ClassType. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2019, 17:48 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovДаже полный лентяй способен прочитать описание каждого, включая ClassType. Спасибо за ответ. Но, к сожалению ClassType никак не подходит для режима RunTime , т.к. его действие фиксируется на этапе компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2019, 17:59 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Maxim.KDimitry SibiryakovДаже полный лентяй способен прочитать описание каждого, включая ClassType. Спасибо за ответ. Но, к сожалению ClassType никак не подходит для режима RunTime , т.к. его действие фиксируется на этапе компиляции. Sure? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2019, 18:23 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2019, 19:21 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
loww Код: pascal 1. 2. 3. 4. loww , большое спасибо за наводку, благодаря Вам найдено решение. Нужно наследоваться от класса скомпилированного с RTTI: это либо наследники TPersistent, либо любой класс с директивой компилятора {$M+}. И эти классы должны иметь виртуальные конструкторы . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2019, 23:11 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Это если Assign реализован. В 99.00% реализации Assign НЕ происходит копирование PRIVATE свойств ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2019, 02:20 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
DimaBr, значит в понятие "копия объекта" эти свойства не входят аналог из реального мира, если мне нужна копия яблока - мне нужно чтобы была та же форма, цвет, вкус, вес... но мне вовсе не нужно, чтобы обе копия яблока занимали одно и то же место в пространстве. Свойства X,Y,Z в данном случае в понятия "копия" не входят Скорее всего, копироваться должны только те свойства, которые входят в вычисление хэша объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2019, 17:26 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Ariochаналог из реального мира, если мне нужна копия яблока - мне нужно чтобы была та же форма, цвет, вкус, вес... Копия яблока не подразумевает копию ходов прогрызенных червяками и самих червяков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2019, 20:43 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Maxim.KКак создать копию(клон) объекта ? В общем виде - никак. Более того, есть классы, специально обученные противодействовать такому. И даже простая попытка создания именованного компонента, лежащего на форме, может вызвать исключение "компонент с таким именем уже есть". То есть, тебе придется определиться с тем, что ты считаешь клонированием и думать над реализацией каждого случая. Например, ты можешь все "клонируемые" классы обучить клонироваться (что бы ты под этим не подразумевал), и просто вызывать нужный метод... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2019, 21:35 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
DimaBr, вроде Assign тут ни при чем, зачем о нем говорят? Как я понял, автор хочет создать объект того же самого класса. А копировать содержимое можно любым способом и без Assign. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2019, 21:56 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Artem.1st...А копировать содержимое можно любым способом... Конечно, можно. Если такой способ существует. А если не существует - то нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2019, 22:01 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
DimaBrAriochаналог из реального мира, если мне нужна копия яблока - мне нужно чтобы была та же форма, цвет, вкус, вес... Копия яблока не подразумевает копию ходов прогрызенных червяками и самих червяков. отлично! В таком случае червяки и их норы будут отсутствовать в .Assign и в .GetHashCode ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2019, 11:28 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Можно тупо скопировать занимаемый объектом участок памяти. Но это грязно и чревато ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2019, 18:31 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Суть класса в том, что он закрытый к изменению извне. И что у него внутри никому не известно. Поэтому только он сам себя имет право копировать. Обычно для этого вводится интерфейс по типу IClonable с единственным методом Clone. И все ваши классы которые должны уметь копироваться просто его реализуют. Проблема в том что по умолчанию в delphi интерфейсы не облегченные. И поэтому всем таким классам надо писать заглушки или унаследоваться от TSingletonImplementation. Если вы хотите клонировать чужие классы, то или чтото не так в вашей архитектуре или надо в них влезать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2019, 19:56 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
X-CiteСуть класса в том, что он закрытый к изменению извне. И что у него внутри никому не известно. Поэтому только он сам себя имет право копировать. Обычно для этого вводится интерфейс по типу IClonable с единственным методом Clone. И все ваши классы которые должны уметь копироваться просто его реализуют. Проблема в том что по умолчанию в delphi интерфейсы не облегченные. И поэтому всем таким классам надо писать заглушки или унаследоваться от TSingletonImplementation. Если вы хотите клонировать чужие классы, то или чтото не так в вашей архитектуре или надо в них влезать. Для этого уже придуман TPersistent.Assign ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2019, 10:21 |
|
||
|
Как создать копию(клон) объекта ?
|
|||
|---|---|---|---|
|
#18+
Василий 2X-CiteСуть класса в том, что он закрытый к изменению извне. И что у него внутри никому не известно. Поэтому только он сам себя имет право копировать. Обычно для этого вводится интерфейс по типу IClonable с единственным методом Clone. И все ваши классы которые должны уметь копироваться просто его реализуют. Проблема в том что по умолчанию в delphi интерфейсы не облегченные. И поэтому всем таким классам надо писать заглушки или унаследоваться от TSingletonImplementation. Если вы хотите клонировать чужие классы, то или чтото не так в вашей архитектуре или надо в них влезать. Для этого уже придуман TPersistent.Assign То что он придуман это хорошо, но придуман он плохо.. В каком-то месте у меня есть некий класс, как узнать без явного вызова Assign и получения Exception умеет ли он себя клонирвать... Странно создавать новый экземпляр и ему передавать как-ой то экземпляр, чтобы словить exception что не реализован и потом разрушить этот экземпляр.. Логичнее у базового проверить умеет ли он Clone и если умеет, то получить новый экземпляр-копию. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2019, 11:18 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39795022&tid=2039631]: |
0ms |
get settings: |
12ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
189ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 569ms |

| 0 / 0 |
