![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
override [D7, WinXP]
tigra © (2006-04-05 15:59:00)разжуйте пожалуйста в каких случаях необходимо использование override и для чего?
спасибо
MBo (2006-04-06 14:27:00) [1]>Amoeba © (06.04.06 14:23) [11]
Виноват, я неверно воспринял.
Amoeba (2006-04-06 14:23:00) [2]
> MBo © (06.04.06 13:03) [10]
Подразумевалось, что именно в случае их перекрытия. А как еще?
MBo (2006-04-06 13:03:00) [3]>Amoeba © (06.04.06 10:52) [8]
>В частности в следующих случаях всегда
Насчет "всегда" - это слишком сильно сказано.
И деструкторы, и конструкторы нуждаются в перекрытии, только если это необходимо (как и другие методы).
tesseract (2006-04-06 11:13:00) [4]преимущество override - всегда можно вызвать перекрытый метод через inherited.
попытка перекрыть виртуальный метод ещё раз указав virtual приведёт к его полному перекрытию и невозможности получить досту к перекрытому методу.
в случае перекрытия не вируального/динамического метода через reintroduce (вообще она просто отключает завывания компилятора) такого сделать нельзя.
виртуальные методы быстрее динамических. Но динамические экономят память.
Amoeba (2006-04-06 10:52:00) [5]
> в каких случаях необходимо использование override
В частности в следующих случаях всегда (иначе наступишь на грабли):
1. У Destroy своих классов (поскольку у TObject и всех его потомков он виртуальный)
2. У конструкторов компонентов (аналогичная ситуация)
Джо (2006-04-05 20:10:00) [6]> пожалуйста в каких случаях необходимо использование override
Вот в этом случае, пожалуй, реальнонеобходимо.
TAbstractFigure = class
public
procedure Draw; virtual; abstract;
end;
TTriangle = class (TAbstractFigure)
public
procedure Draw; override;
end;
Anatoly Podgoretsky (2006-04-05 20:06:00) [7]TUser © (05.04.06 19:30) [5]
Виртуальные - это когда будет казаться, что у тебя один метод, а на самом деле другой. Меня тоже простите :-)
TUser (2006-04-05 19:30:00) [8]Коротко говоря - у тебя есть класс-предок. У него там написан виртуальный метод. Виртуальный, это означет, что его адрес заранее узнать нельзя. Поэтому в отличае от обычного (да простят меня за терминологию) метода, при вызове виртуального сначала произойдет поиск в таблице VMT. А у наследника в этой таблице адрес может быть просто подменен на новый - это если ты используешь сабжевую инструкцию. С данамическими почти так же.
Да простят меня за поверхностность описания.
Jeer (2006-04-05 17:57:00) [9]Юрий Зотов © (05.04.06 16:35) [3]
Нельзя, но это [2] - чтобы и попыток не делали:))
Юрий Зотов (2006-04-05 16:35:00) [10]> Сергей М. © (05.04.06 16:04) [2]
Можно перекрыть НЕодноименный метод?
Сергей М. (2006-04-05 16:04:00) [11]Для перекрытия виртуальных и динамических одноименных методов классов-предков
Юрий Зотов (2006-04-05 16:03:00) [12]Вас устроит такой ответ: для перекрытия виртуальных и динамических методов?
Если нет, то придется сначала объяснять основы ООП и объектной модели Delphi. По объему это потянет на главу книги - так, может быть, лучше ее и почитать?