|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
есть базовый класс Base. В нем есть метод(виртуальный) который что-то парсит и делает из этого объект MyObject, вызываю метод в конструкторе. Почему он виртуальный? Т.к. наследник может изменить логику парсинга. Объект MyObject доступен для чтения потомкам (public get;). Как избавить от виртуальности, но при этом не вызывая этот метод отдельно? Пока такие варианты: 1. передавать объект MyObject в конструктор, если он null вызывать метод (но уже приватный) 2. передавать делегат парсинга, что вообщем не сильно от п.1 отличается... Какие предложения? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 11:43 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#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. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 12:12 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
skyANA, хм, ну да ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 12:15 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
netivan, и что не устраивает? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 12:16 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
skyANA, да вроде уже все. я дурак просто) делал примерно так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 12:21 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
Вызов виртуального метода в конструкторе - плохая практика, чреватая исключениями в случае, если текущий экземпляр не является most derived потомком базового класса в иерархии наследования - virtual member будет всегда вызываться именно для этого most derived, конструктор которого еще не отработал. Решарпер, выдавая warning на virtual member constructor call, в т.ч. просто предлагает сделать класс sealed. Здесь, как я понимаю, наследование нужно. Я бы смотрел в сторону паттернов типа FactoryMethod. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 13:02 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, с трудом представляю где тут фабрику воткнуть... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 13:43 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
netivan, Тут просто надо себе хорошо представлять, чем может быть чреват вызов виртуального метода в конструкторе - он в ряде случаев вполне возможен, и ничем не чреват: Код: 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. 33. 34. 35. 36. 37. 38.
Вызываем: Код: c# 1.
В консоли получаем: Код: plaintext 1. 2. 3. 4. 5. 6.
Теперь меняем Class3 вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Вызываем, и после вывода Class1.ctor сразу получаем DivideByZeroException. Причина - в конструкторе Class1 был вызван виртуальный метод most derived реализации, т.е. от Class3, но при этом еще не был вызван конструктор Class3, который нужным образом инициализирует состояние. Т.е. если реализация виртуального метода не зависит от состояния most derived класса, то вызов этого метода в конструкторе ничем не чреват. Только вот если потом кто-то унаследуется от такого класса, и реализует метод с завязкой на состояние - то может быть по-разному. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 14:29 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
netivan, не обязательно фабрику втыкать. Вот: Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 14:29 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, спасибо за пример. состояние у меня на данный момент нет, т.е. все просто - на вход строка, на выходе объект. Разница в классах(базовый и наследники) только в алгоритме. Но это я так думаю сейчас, но как вы правильно заметили, кто знает что сделают последователи :) skyANA, спасибо,рассмотрим. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 14:38 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
netivan, разделть конструирование и окончательную инициализацию - религия не позволяет? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 21:46 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
Изопропил, я так понимаю это: Код: c# 1. 2.
[/SRC] конечно такой вариант есть, только это метод надо отдельно вызывать и писать проверки. такой вариант конечно имеет место быть) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 12:17 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
netivanтолько это метод надо отдельно вызывать и писать проверки. такой вариант конечно имеет место быть) ну а если статик метод? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 12:29 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
beg-in-ernetivanтолько это метод надо отдельно вызывать и писать проверки. такой вариант конечно имеет место быть) ну а если статик метод?Предлагал уже: 14047768 . ТС написал, что рассмотрят. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 13:13 |
|
вызов вирт метода в конструкторе - как избежать
|
|||
---|---|---|---|
#18+
skyANA, nj ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 13:37 |
|
|
start [/forum/topic.php?fid=20&tid=1405014]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 306ms |
total: | 457ms |
0 / 0 |