Форум: "Прочее";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];
ВнизПолиморфизм Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c