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

•  DeLiKaTeS Tetris (Тетрис)  4 154

•  TDictionary Custom Sort  6 215

•  Fast Watermark Sources  6 015

•  3D Designer  8 911

•  Sik Screen Capture  6 350

•  Patch Maker  6 769

•  Айболит (remote control)  6 750

•  ListBox Drag & Drop  5 625

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

•  Графические эффекты  6 972

•  Рисование по маске  6 240

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

•  Canvas Drawing  5 510

•  Рисование Луны  5 212

•  Поворот изображения  4 761

•  Рисование стержней  3 366

•  Paint on Shape  2 620

•  Генератор кроссвордов  3 509

•  Головоломка Paletto  2 798

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

•  Пазл Numbrix  2 365

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

•  Игра HIP  2 001

•  Игра Go (Го)  1 926

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

•  Программа укладки плитки  1 987

•  Генератор лабиринта  2 441

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

•  HEX View  2 459

•  Физический маятник  2 078

 
скрыть

  Форум  

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-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

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