|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Здравствуйте! Не въезжаю пока в один казус, прошу объяснить. Имеется цепочка наследования. Код: 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.
Почему при вызове метода Test (класса DataTableС) последовательно вызываются 1. Конструктор DataTable 2. Конструктор DataTableA 3. Конструктор DataTableB 3. Конструктор DataTableC Я предполагал, что вызовется только Конструктор DataTable. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 10:57 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Новичок ООП.., У тебя, при вызове DataTableC.Test() вызывается метод, объявленный в родительском класса DataTableA.CloneMe(). А как ты думаешь в этом случае "this" в методах DataTableC.Test() и DataTableA.CloneMe() ссылаются на один и тот же объект или на разные? А, если на один и тот же объект, то какого типа этот объект: DataTable, DataTableA или DataTableC? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 11:14 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Новичок ООП..Я предполагал, что вызовется только Конструктор DataTable. На основании чего базировалось такое предположение? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 11:58 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Новичок ООП..Почему при вызове метода Test (класса DataTableС) последовательно вызываются 1. Конструктор DataTable 2. Конструктор DataTableA 3. Конструктор DataTableB 3. Конструктор DataTableC Я предполагал, что вызовется только Конструктор DataTable. Давайте немного сократим код, для понимания. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Согласно Вашей логике, строчка кода new DataTableC().Test() должна вызвать исключение? Но ведь этого не происходит, тк сперва срабатывают по иерархии, начиная с главного, т.е DataTable, дальше DataTableA и DataTableC. В противном случае как в дочернем классе работать с элементами родительского? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:17 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Новичок ООП..Я предполагал, что вызовется только Конструктор DataTable. Правильно, так и должно быть. Может реальный код не такой как ты тут привел? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:28 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Dima TНовичок ООП..Я предполагал, что вызовется только Конструктор DataTable. Правильно, так и должно быть. Может реальный код не такой как ты тут привел?Мне незачем обманывать, Дим, тем более, что код, который я привёл, проверяется на счёт "раз", если кому не лень. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:34 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Dima TПравильно, так и должно быть. Может реальный код не такой как ты тут привел? С какого перепугу? Метод Test - инстансный метод, он может быть быть вызван только после вызова конструктора DataTableC, который повлечет за собой вызовы вверх по иерархии наследования всех конструкторов базовых классов без параметров. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:35 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Метод DataTable.Clone() виртуальный. Если ты его переопределил в DataTableC и там создаешь объект DataTableC, то вызовется вся цепочка конструкторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:38 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
stomsky, до меня дошло, что в this (метода CloneMe) попадает объект типа DataTableC но то, что в переменную table типа DataTable (того же метода) попадает объект типа DataTableC для меня явилось полной неожиданностью ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:40 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Dima TМетод DataTable.Clone() виртуальный. Если ты его переопределил в DataTableC и там создаешь объект DataTableC, то вызовется вся цепочка конструкторов.Метод Clone я НЕ переопределял, и в мыслях такого не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:40 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныМетод Test - инстансный метод, он может быть быть вызван только после вызова конструктора DataTableC, который повлечет за собой вызовы вверх по иерархии наследования всех конструкторов базовых классов без параметровТак не в этом же дело! А в том, что вся эта цепочка конструкторов вызывается при срабатывании Clone из DataTable ! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:43 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Новичок ООП..код, который я привёл, проверяется на счёт "раз", если кому не лень. Затестил, так и есть. Вот что в хэлпе по этому поводу https://msdn.microsoft.com/ru-ru/library/system.data.datatable.clone(v=vs.110).aspx Комментарии Если эти классы являются производными, копия также будет производным классом. т.е. DataTable.Clone() вернет объект DataTableC поэтому при создании нового объекта вызываются все конструкторы. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:52 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Dima TDataTable.Clone() вернет объект DataTableCвот-вот, в этом вся суть. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:56 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Новичок ООП..Так не в этом же дело! А в том, что вся эта цепочка конструкторов вызывается при срабатывании Clone из DataTable ! Раз: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Два: Код: c# 1. 2. 3.
this в данном случае указывает на фактический тип, и именно его (DataTableC) создает вызов Activator.CreateInstance(this.GetType(), true) - с вызовом конструктура, и, как выше было написано, всех остальных вышестоящих по иерархии наследования. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 12:57 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Спасибо, товарищи! Суть вопроса вы уловили верно и я теперь понял это загадочное происшествие. Теперь заодно может подскажете, как мне клонировать объект DataTableC в объект DataTable (мне в принципе только структуру столбцов скопировать надо) без создания объекта типа DataTableC ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 13:01 |
|
Вызывается больше конструкторов, чем я предполагал...
|
|||
---|---|---|---|
#18+
Новичок ООП..Теперь заодно может подскажете, как мне клонировать объект DataTableC в объект DataTable (мне в принципе только структуру столбцов скопировать надо) без создания объекта типа DataTableC ? Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2017, 13:11 |
|
|
start [/forum/topic.php?fid=20&msg=39462184&tid=1399878]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 291ms |
total: | 538ms |
0 / 0 |