Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.20;
Скачать: CL | DM;

Вниз

Полиморфизм   Найти похожие ветки 

 
Nickolay   (2010-11-11 09:36) [0]

Здравствуйте!
Кто может объяснить, почему или зачем virtual или dynamic методы
в классах-потомках переобъявляются с директивой override?
Зачем заводить еще одно ключевое слово, когда в объектном типе
достаточно было и у предков, и у потомков объявлять virtual?


 
Palladin ©   (2010-11-11 09:37) [1]

а ты никогда не читал предупреждения компилятра при отсутствии override ? почитай, увлекательно


 
И. Павел ©   (2010-11-11 09:38) [2]

ИМХО, это сделано, чтобы программисту было сложнее спутаться.
Например, и без overload можно: просто писать несколько функций с одним именем, как в C++.


 
И. Павел ©   (2010-11-11 09:39) [3]

Ну и, конечно, чтобы именно этот метод вызывался при полиморфизме. Например, чтобы вызвался деструктор самого верхнего уровня.


 
Dimka Maslov ©   (2010-11-11 16:26) [4]

В сях переопределённые виртуальные методы вообще ничем не обозначаются


 
Nickolay   (2010-11-12 16:45) [5]


> Palladin ©  [1]
> а ты никогда не читал предупреждения компилятра при отсутствии
> override ? почитай, увлекательно


Компилятор: [Warning]: Method "Fout" hides virtual method of base type "TA"
                      Метод Fout скрывает виртуальный метод базового типа TA

Это, конечно, увлекательно, но это не отвечает на возникший вопрос:
зачем еще одно ключевое слово (override)? В типе object без него же
обходятся!


 
Nickolay   (2010-11-12 16:50) [6]


> И. Павел ©   [3]
> Ну и, конечно, чтобы именно этот метод вызывался при полиморфизме.
>

Это и так понятно! Вопрос в том, зачем еще одно ключевое слово?
В типе object и предок, и потомок имеют просто одно ключевое слово
virtual и все работает!


 
Amoeba_   (2010-11-12 17:05) [7]


> зачем еще одно ключевое слово (override)? В типе object
> без него же
> обходятся!
>

Было бы странно, ели бы было иначе! Это же самый низший уровень, у него нет и не может быть никаких предков.


> Компилятор: [Warning]: Method "Fout" hides virtual method
> of base type "TA"
>                       Метод Fout скрывает виртуальный метод
> базового типа TA
>

В этой связи посмотри в справке про еще одно ключевое словечко - reintroduce/


 
Mystic ©   (2010-11-12 17:06) [8]

Чтобы не запоминать, что там было, virtual или dynamic. И чтобы не наступать на грабли, когда мы вводим новый виртуальный метод, но по ошибке переопределяем старый...


 
12 ©   (2010-11-12 17:10) [9]


> зачем еще одно ключевое слово

чтоб явно указывать, что именно перекрываешь виртуальный метод.
мне кажется так нагляднее

virtual - да, ранее работало ништяки
А как различать, создал или  перекрыл?


 
StriderMan ©   (2010-11-12 17:14) [10]


> Например, и без overload можно: просто писать несколько
> функций с одним именем

 TForm1 = class(TForm)
 private
 public
   procedure P;
   procedure P(A: integer);
 end;

[Error] Unit1.pas(15): Overloaded procedure "P" must be marked with the "overload" directive

Delphi7


 
Nickolay   (2010-11-12 17:18) [11]

Голова может опухнуть от обилия новых слов!
По-моему, язык тем лучше, чем он компактнее!


 
vuk ©   (2010-11-12 18:07) [12]

to Nickolay   (12.11.10 17:18) [11]:

> По-моему, язык тем лучше, чем он компактнее!

С этой точки зрения, Brainfuck - один из лучших языков. :)


 
DVM ©   (2010-11-12 18:16) [13]


> Кто может объяснить, почему или зачем virtual или dynamic
> методы
> в классах-потомках переобъявляются с директивой override?
>

Может потому что метод с одним и тем же названием может быть в иерархии более чем из 2 классов?


 
И. Павел ©   (2010-11-12 18:19) [14]


> StriderMan ©   (12.11.10 17:14) [10]

Я имел ввиду, что в принципе есть языки, где обходятся без overload. Например C++. Но с overload, как и с override, нагляднее.


 
Anatoly Podgoretsky ©   (2010-11-12 18:26) [15]

> Nickolay  (12.11.2010 16:50:06)  [6]

Термины Virtual и Override позволяют увидеть откуда ноги растут, кроме того
Override применяется и к Dynamic


 
Anatoly Podgoretsky ©   (2010-11-12 18:28) [16]

> StriderMan  (12.11.2010 17:14:10)  [10]

Писать нельзя но оно понимает, что попытка перекрытия и требует это явно
указать.


 
_Юрий   (2010-11-12 18:51) [17]

так удобнее, глядя на метод, сразу ясно - начинается ли он тут, или раньше (в предке)


 
Юрий Зотов ©   (2010-11-12 19:02) [18]

> Nickolay   (12.11.10 16:45) [5]

Если слово override не написано, то это означает начало новой цепочки наследования. Поэтому слово не лишнее - оно расширяет возможности программиста.


 
han_malign   (2010-11-13 15:57) [19]


> зачем еще одно ключевое слово (override)

- сколько раз программируя на C++, я после долгих бессоных ночей громко ругался матом из-за того, что удостовериться в том, что виртуальный метод перекрыт, и перекрыт именно тот метод который нужен - можно только с помощью точки останова...



Страницы: 1 вся ветка

Текущий архив: 2011.02.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
15-1289312897
hattak
2010-11-09 17:28
2011.02.20
Как отследить события в Internet Explorer


6-1234984194
d@vinchi
2009-02-18 22:09
2011.02.20
Как прослушивать определенный ТСР порт?


2-1290969784
elluminate
2010-11-28 21:43
2011.02.20
Подсчет суммы ряда


6-1234780921
антон1243232
2009-02-16 13:42
2011.02.20
Подскажите новичку NetBios


2-1290700141
Анонимус
2010-11-25 18:49
2011.02.20
Как обрезать Image в Delphi 7?