Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1290672490
DeadAlice
2010-11-25 11:08
2011.02.20
Аналог функции sleep() без прерывания работы приложения


2-1290689216
FIL-23
2010-11-25 15:46
2011.02.20
Передача edita в собственную процеду.


15-1289510991
Юрий
2010-11-12 00:29
2011.02.20
С днем рождения ! 12 ноября 2010 пятница


2-1290762980
axels
2010-11-26 12:16
2011.02.20
gecko browser


9-1188473601
@!!ex
2007-08-30 15:33
2011.02.20
Загрузочный экран.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский