|
new void Dispose()
|
|||
---|---|---|---|
#18+
Есть класс выведенный из базового, у которого где-то внутри есть свой Dispose(). Мне нужен Dispose в моем, но когда добавляю, студия пишет мне что мой спрячет Dispose базового и предлагает сделать так Вопрос: Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2016, 14:10 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
Ролг Хупин, Код: c# 1.
- этого нужно в наследнике переопределять (если Dispose по рекомендациям MS реализован) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2016, 14:33 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
Ролг Хупин Код: c# 1.
У меня для вас плохие новости: Код: 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.
- догадайтесь с трех раз, что будет в консольном выводе. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2016, 15:14 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныРолг Хупин Код: c# 1.
У меня для вас плохие новости: Код: 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.
- догадайтесь с трех раз, что будет в консольном выводе. И угадайте, что будет, если сделать вот-так: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2016, 18:17 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
Ролг Хупин, никаких new, только override! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2016, 19:37 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
mikronИ угадайте, что будет, если сделать вот-так: Код: c# 1.
Да что тут угадывать, я и так знаю. Но здесь имеет место быть один нюанс: на уровне IL Bar.Dispose после введения интерфейса будет выглядеть вот так: Код: c# 1.
(ключевое слово выделено). Точно так же выглядит определение Dispose у Foo. Т.е. мы вместо переопределения (override) метода: Код: c# 1.
просто добавили в vtable новый слот с Dispose. При корректной реализации вызовов Dispose базовых классов при приведении к интерфейсу всё будет в порядке. А вот при приведении к классам в иерархии наследования поведение будет меняться в зависимости от того, к чему приводим, и вне зависимости от фактического типа: Код: 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.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
- это потенциальный источник очень трудновылавливаемых граблей. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 08:18 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
Сон Веры Павловны Код: plaintext 1. 2. 3. 4. 5. 6. 7.
- это потенциальный источник очень трудновылавливаемых граблей. Взгляните с другой стороны: описанное повидение является нормальным для всех перегруженух функций. Другими словами, продолжая вашу мысль: все не виртульные функции - потенциальный источник труднообнаружимых ошибок. Я не буду спорить с этим, но в шарпе такие правила игры. И если их принимать как данность то логично две поведенческих модели: или признать переопределение нормальной практикой и удельть этому внимание при разработке, или делать все методы виртуальными. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 10:32 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
mikronИ если их принимать как данность то логично две поведенческих модели: или признать переопределение нормальной практикой и удельть этому внимание при разработке, или делать все методы виртуальными. Это крайности, я придерживаюсь середины: не делаю все методы виртуальными, но и переопределение нормой не считаю, и использую его только в самых крайних случаях. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 10:37 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Это дскретный выбор. Вы выбрали первое, а остальное только ваши личные предпочтения. Если вы работаете с чужим кодом то вам придётся мирится с правилами игры и всегда брать их во внимание. Дрыгими словами пъёте вы чай с сахаром или без не меняет того что вам подадут в кафе. Исли у ТС нет возможности изменить базовый класс, то вполне нормально перегрузить метод и жить с этой болью. ИМХО. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 10:52 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
mikronИсли у ТС нет возможности изменить базовый класс, то вполне нормально перегрузить метод и жить с этой болью. ИМХО. Разумеется. Речь о ситуациях, где есть возможность выбора. Да и в случае ТС мы знаем только то, что ему приспичило возиться с наследованием. Хотя, вполне возможно, выходом было бы агрегирование. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 11:07 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныmikronИсли у ТС нет возможности изменить базовый класс, то вполне нормально перегрузить метод и жить с этой болью. ИМХО. Разумеется. Речь о ситуациях, где есть возможность выбора. Да и в случае ТС мы знаем только то, что ему приспичило возиться с наследованием. Хотя, вполне возможно, выходом было бы агрегирование. не приспичило мне, просто нужно сделать обязательно некторые действия на разрушении объекта, а тут такое ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 11:36 |
|
new void Dispose()
|
|||
---|---|---|---|
#18+
mikronИ угадайте, что будет, если сделать вот-так: Код: c# 1.
А так? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 12:25 |
|
|
start [/forum/topic.php?fid=20&tid=1400205]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 281ms |
total: | 437ms |
0 / 0 |