Недавно добавленные исходники

•  Animation Loaders  882

•  DeLiKaTeS Tetris (Тетрис)  5 827

•  TDictionary Custom Sort  7 783

•  Fast Watermark Sources  7 457

•  3D Designer  10 685

•  Sik Screen Capture  8 006

•  Patch Maker  8 211

•  Айболит (remote control)  8 261

•  ListBox Drag & Drop  7 073

•  Доска для игры Реверси  100 598

•  Графические эффекты  8 336

•  Рисование по маске  7 712

•  Перетаскивание изображений  6 314

•  Canvas Drawing  6 686

•  Рисование Луны  6 617

•  Поворот изображения  5 757

•  Рисование стержней  4 697

•  Paint on Shape  3 404

•  Генератор кроссвордов  4 379

•  Головоломка Paletto  3 524

•  Теорема Монжа об окружностях  4 334

•  Пазл Numbrix  2 807

•  Заборы и коммивояжеры  3 753

•  Игра HIP  2 524

•  Игра Go (Го)  2 523

•  Симулятор лифта  2 917

•  Программа укладки плитки  2 345

•  Генератор лабиринта  3 090

•  Проверка числового ввода  2 582

•  HEX View  2 984

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Перекрытие виртуальных методов



Кто-нибудь знает, в чем разница между перекрытием (OVERRIDING) виртуального метода и заменой (REPLACING) его? Я немного запутался.

Допустим у вас есть класс:


TMyObject = class (TObject)

и его наследник:


TOverrideObject = class (TMyObject)

К примеру, TMyObject имеет метод Wiggle:


procedure Wiggle; virtual;

а TOverrideObject перекрывает Wiggle:


procedure Wiggle; override;

и, естественно, вы реализовали оба метода.

Теперь вы создаете TList, содержащий целую кучу MyObjects и OverrideObjects в свойстве TList.Items[n]. Свойство Items является указателем, поэтому для вызова метода Wiggle вам достаточно вызвать необходимый элемент списка. Например так:


if TObject(Items[1]) is TMyObject then
  TMyObject(Items[1]).Wiggle
else
if TObject(Items[1]) is TOverrideObject then
  TOverrideObject(Items[1]).Wiggle;

но возможности полиморфизма и директива override позволяют вам сделать так:


TMyObject(Items[1]).Wiggle;

Ваше приложение посмотрит на экземпляр специфического объекта, ссылка на который содержится в Items[1] и скажет: "Да, это - TMyObject, но, точнее говоря, это TOverrideObject; но поскольку метод Wiggle является виртуальным методом и TOverrideObject переопределил метод Wiggle, я собираюсь выполнить метод TOverrideObject.Wiggle, а не метод TMyObject.Wiggle."

Теперь представьте себе, что при декларации метода вы пропустили директиву override, попробуйте это выполнить теперь:


TMyObject(Items[1]).Wiggle;

Приложение и в этом случае должно "видеть" данный метод, даже если Items[1] - TOverrideObject; но у него отсутствует перекрытая версия метода Wiggle, поэтому приложение выполнит TMyObject.Wiggle, а не TOverrideObject.Wiggle (поведение, которое вы можете как хотеть, так и избегать).

Так, перекрытый метод функционально может отличаться от декларированного метода, содержащего директиву virtual (или dynamic) в базовом классе, и объявленный с директивой override в классе-наследнике. Для замены метода необходимо объявить его в классе-наследнике без директивы override. Перекрытые методы могут выполняться даже тогда, когда специфический экземпляр класса-предка является точной копией базового класса. "Замененные" методы могут выполняться только тогда, когда специфический экземпляр является "слепком" только этого класса.








Copyright © 2004-2026 "Delphi Sources" by «SiteAnalyzer». Delphi World FAQ

Группа ВКонтакте