|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
user7320Оверрайдить через оверлоад. =)) писец ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 18:30 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
pationuser7320Я, кстати, не понимаю, в чём разница между парой "virtual-override" и "new" я же спрашивал тебя =)) учи матчасть Не люблю я ответы, где из всего стоящее только "учи матчасть". Можно форумы все позакрывать и повесить заглушку на главную с крупными буквами "УЧИ МАТЧАСТЬ". Ну и баннеров вокруг понавтыкать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 18:57 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
user7320Вот тем, у тех, у кого нет такой специфики - действительно, у них М и ВМ выглядят одинаково и ВМ так кажется лишним слоем.Не лишним, а чем-то отличающимся от других слоёв логики настолько, чтобы иметь специальное название. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:07 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
user7320, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
а теперь попробуй создать класс Derived2 : Derived1, в котором оверрайдится Foo. Это раз. Далее: Код: c# 1. 2.
Вопрос: что будет в консольном выводе? И что будет в случае override? Вопрос на пятерку - объяснить различие консольных выводов. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:10 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
pationuser7320Я, кстати, не понимаю, в чём разница между парой "virtual-override" и "new" я же спрашивал тебя =)) учи матчасть Я вот не знаю, как это понимать: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx It is an error to use both new and override on the same member, because the two modifiers have mutually exclusive meanings. The new modifier creates a new member with the same name and causes the original member to become hidden. The override modifier extends the implementation for an inherited member. Наверное, отличия во внутреннем представлении в CLR или где там. А для программиста это выглядит одинаково - и так и так (и через new, и через override) я скрываю метод базового класса и не могу его вызвать из текущего класса. Но могу вызвать его через base или через приведение к базовому. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:20 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
user7320, Или вы очень криво выражаетесь, или не понимаете, что override и new это совершенно разные вещи: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:35 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Сон Веры Павловныuser7320, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
а теперь попробуй создать класс Derived2 : Derived1, в котором оверрайдится Foo. Это раз. Ну, второй-то Фу я прооверрайдю (через ещё один new), а первый-то нет - он же скрыт. Ну, я понял теперь, в чём разница. Но для первого уровня наследования разницы нет? Сон Веры ПавловныДалее: Код: c# 1. 2.
Вопрос: что будет в консольном выводе? И что будет в случае override? Вопрос на пятерку - объяснить различие консольных выводов. В выводе будет Фу от Class. Почему - не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:36 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныДалее: Код: c# 1. 2.
Вопрос: что будет в консольном выводе? И что будет в случае override? Вопрос на пятерку - объяснить различие консольных выводов. При этом при оверрайде - Фу от Derived1. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:37 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, у меня такой вывод: // Если в Derived1 new Class.Foo Derived1.Foo Derived2.Foo Class.Foo ConsoleApplication1.Derived1 // Если в Derived1 override Class.Foo Derived1.Foo Derived2.Foo Derived1.Foo ConsoleApplication1.Derived1 Код: 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. 42.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:43 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
user7320, Модификатор new создает новый член с таким же именем и приводит к скрытию исходного члена. Модификатор override расширяет реализацию для наследуемого члена. Взято отсюда: http://msdn.microsoft.com/ru-ru/library/435f1dw2.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:44 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Lelouchuser7320, Модификатор new создает новый член с таким же именем и приводит к скрытию исходного члена. Модификатор override расширяет реализацию для наследуемого члена. Взято отсюда: http://msdn.microsoft.com/ru-ru/library/435f1dw2.aspx Так я про то же цитату и привёл. И мне эти слова мало о чём говорят. Чем "сокрытие" отличается от "расширения"? Без примеров это пустые слова. Ну, мне уже объяснили выше. Правда, я всё равно не понял, почему это так происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:55 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Lelouchuser7320, Или вы очень криво выражаетесь, или не понимаете, что override и new это совершенно разные вещи: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Это то же, что и у Сон Веры Павловны. Я всё равно не понимаю, почему это так происходит. Кстати, вот эти ваши слова авторМодификатор new создает новый член с таким же именем и приводит к скрытию исходного члена. Модификатор override расширяет реализацию для наследуемого члена. Взято отсюда: http://msdn.microsoft.com/ru-ru/library/435f1dw2.aspx противоречат вашему примеру. В примере в третьем случае new должен скрыть исключение (ну таписано же так!), а он его наоборот - показывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 19:58 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Lelouch, и в рантайме ((A)(new C())) является типом С, а не А (в аналогичном примере Сон Веры Павловны это видно - я GetType() вызывал). Но вызывается метод из А почему-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:00 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Тут ещё что-то намешно из приведения типов. Вот в МСДН для new простой пример приведён без приведения типов - и работает всё так, как объяснено. Но стоит только войти в игру приведению типов, как всё с ног на голову встаёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:01 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
user7320, (То что я описываю - мое упрощенное понимание, судя по http://msdn.microsoft.com/en-us/magazine/cc163791.aspx - все несколько сложнее) потому что метод C.M() это новый метод, никакого отношения к A.M() не имеющий. Судя по сигнатуре вызова метода в IL (пример отсюда ): IL_0002: call instance void ConsoleApplication1.Base::foo() для ((A)(new B())).M() ((A)(new C())).M() вызов в IL будет выглядеть одинаково: call instance void A::M(); Так как метод M() вирутальный, то будет применен виртуальный вызов. CLR определит реальный тип объекта (B и С) и начнет искать "ближайшее" к ним в иерархии наследования переопределение меторда. В случае класса B - это переопределение выполнено в нем самом, будет взята его релизация. В случае класса C - переопределение не выполнялось, метода C.M() нет в таблице виртуальных методов (если добавить если слово Virtual, он там появится, НО! это в любом случае совершенно новый метод, не имеющий отношения к методу A.M(), и не являющийся его новой реализацией) - поэтому будет вызван метод A.M(); Как то так, надеюсь троечку от Сна Веры Павловны я заслужил ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:21 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Lelouch, поправка, вызов будет callvirt instance void A::M() (виртуальный вызов) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 20:55 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Lelouch, авторТак как метод M() вирутальный, то будет применен виртуальный вызов и да и нет, виртуал может быть и для простого экземплярного, и просто call все зависит от кода.. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 21:07 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Где-то в степи, я же говорил о своем примере, метод A::M() помечен как виртуальный ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 21:18 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Lelouch, я ничего против не имею, но строчку "Так как метод M() вирутальный, то будет применен виртуальный вызов" можно и убрать так как она наводит на мысль, если метод будет не виртуальный то и вызов будет не вертуальный.. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 21:24 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Где-то в степи, да я бы там много что брал, в том числе орфографические ошибки) но кнопки редактирования нет ) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 21:28 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Lelouchuser7320, (То что я описываю - мое упрощенное понимание, судя по http://msdn.microsoft.com/en-us/magazine/cc163791.aspx - все несколько сложнее) потому что метод C.M() это новый метод, никакого отношения к A.M() не имеющий. Судя по сигнатуре вызова метода в IL (пример отсюда ): IL_0002: call instance void ConsoleApplication1.Base::foo() для ((A)(new B())).M() ((A)(new C())).M() вызов в IL будет выглядеть одинаково: call instance void A::M(); Так как метод M() вирутальный, то будет применен виртуальный вызов. CLR определит реальный тип объекта (B и С) и начнет искать "ближайшее" к ним в иерархии наследования переопределение меторда. В случае класса B - это переопределение выполнено в нем самом, будет взята его релизация. В случае класса C - переопределение не выполнялось, метода C.M() нет в таблице виртуальных методов (если добавить если слово Virtual, он там появится, НО! это в любом случае совершенно новый метод, не имеющий отношения к методу A.M(), и не являющийся его новой реализацией) - поэтому будет вызван метод A.M(); Я вот чего не понимаю. Почему "реальный тип объекта" - В и С, а метод вызывается как от А? Я так понимаю, что приведение к менее унаследованному типу как бы "отсекает" функциональность более унаследованных типов. Да? Но при этом объект остаётся по-прежнему более унаследованным, а не тем, к которому он приведён. Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 22:38 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
user7320менее унаследованному user7320более унаследованным что за терминология? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 22:49 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Изопропилuser7320менее унаследованному user7320более унаследованным что за терминология?Нечёткая логика? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2014, 05:40 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
user7320Не пойму, ты с ООП что ли не знаком? В ужасе читать классику про инкапсуляция/наследование/ полиморфизм . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2014, 05:43 |
|
Переписать только геттер при наследовании
|
|||
---|---|---|---|
#18+
Вы меня запутали! Это вы во всём виноваты! До того, как я сюда зашёл, у меня был нормальный такой маленький new, который оверрайдил оверлоадом геттер свойства более унаследованного класса и вообще работал. А с вами я скоро алфавит начну забывать, не то, что нечёткую логику пременять. Лучше пойду джаваскрипт изучать... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2014, 07:01 |
|
|
start [/forum/topic.php?fid=20&msg=38623695&tid=1402958]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 149ms |
0 / 0 |