Главная » Delphi » Типы методов

0

Методы  объекта могут быть  описаны как статические (static),  виртуальные (virtual), динамические (dinamic) или как методы  обработки сообщения (message). Рассмотрим следующий  пример:

TFoo = class

procedure IAmAStatic;

procedure IAmAVirtual; virtual;

procedure IAmADynamic; dynamic;

procedure IAmAMessage(var M: TMessage); message wm_SomeMessage;

end;

Статические методы

Статический метод (static)  IAmAStatic работает подобно обычной процедуре или функции. Этот  тип  методов  устанавливается по умолчанию. Адрес такого  метода  из вестен  уже на стадии  компиляции, и компилятор в коде  программы оформляет все вызовы данного метода  как статические. Такие  методы  работают быстрее других,  од нако не могут быть перегружены в целях полиморфизма объектов.

НА ЗАМЕТКУ

Хотя Object Pascal и поддерживает статические методы, но он не поддерживает стати- ческие переменные-члены подобно C++ или Java. Для достижения такого эффекта в Object Pascal применяют глобальные переменные. Если необходимо, чтобы глобаль- ная переменная вела себя как закрытая, достаточно поместить ее объявление в раз- дел реализации (implementation).

Виртуальные методы

Метод  IAmAVirtual объявлен как виртуальный (virtual). Вызов  таких  методов из за возможности их  перегрузки немного сложнее, чем  вызов  статического ме тода,  так как во время  компиляции адрес  конкретного вызываемого метода  не из вестен. Для  решения этой  задачи  компилятор строит таблицу виртуальных методов (VMT —   Virtual   Method  Table),  обеспечивающую определение  адреса   метода   в процессе выполнения программы. VMT содержит все виртуальные методы  предка и виртуальные методы  самого  объекта, поэтому  виртуальные методы  используют несколько больший объем памяти, чем методы  динамические, однако  их вызов происходит быстрее.

Динамические методы

Динамический  (dynamic) метод  IAmADynamic в целом  подобен виртуальным мето дам, но обслуживается другой  диспетчерской системой. Каждому  динамическому ме тоду компилятор назначает уникальное число  и использует его вместе  с адресом  мето да для построения таблицы динамических методов (DMT — Dynamic Method Table). В отличие от VMT, DMT содержит методы  лишь данного объекта, благодаря чему обес печивается экономия используемой памяти, но замедляется вызов  метода,  поскольку для поиска  его адреса, скорее всего,  будет пересмотрена не одна DMT в иерархии объектов.

Методы обработки сообщения

Метод  обработки сообщений (message handling) IAmAMessage. Значение после  клю чевого слова message определяет сообщение, в ответ  на которое вызывается данный метод. Такие  методы  создаются для реакции на те или иные  сообщения Windows. Они никогда  не вызываются непосредственно из программы. Более подробная информа ция об обработке сообщений приведена в главе 3, “Приключения сообщения”.

Переопределение методов

Переопределение (overriding) метода  в Object Pascal реализует концепцию полимор физма. Оно позволяет изменять поведение метода от наследника к наследнику. Переоп ределение метода  возможно только  в том случае, если первоначально он был объявлен как virtual или  dynamic. Для переопределения метода  при  его  объявлении вместо ключевых слов virtual или dynamic следует указать ключевое слово override. Ниже приведен пример переопределения методов IAmAVirtual и IAmADynamic.

TFooChild = class(TFoo)

procedure IAmAVirtual; override;

procedure IAmADynamic; override;

procedure IAmAMessage(var M: TMessage); message wm_SomeMessage;

end;

Директива override приводит к замещению строки описания исходного метода  в VMT строкой описания нового метода. Если объявить новые  функции с ключевым словом virtual или dynamic, а не override, то вместо  замещения старых  будут созданы новые методы.  В случае переопределения статического метода,  новый вариант просто полно стью заменит статический метод родителя.

Перегрузка метода

Подобно обычным процедурам и функциям, методы  могут быть  перегружены таким образом, чтобы  класс содержал несколько методов с одним именем, но с различными спи сками параметров. Перегруженные методы  должны  быть объявлены с указанием  директи вы overload (использовать эту директиву при описании первого перегруженного метода необязательно). Вот пример объявления объекта с перегруженными методами:

type

TSomeClass = class

procedure AMethod(I: Integer); overload;

procedure AMethod(S: string); overload;

procedure AMethod(D: Double); overload;

end;

Дублирование имен методов

Иногда может понадобиться к одному из классов добавить метод, замещающий метод с тем же именем, но принадлежащий предку этого  класса. В данном  случае требуется не пе реопределить исходный метод, а полностью его заменить. Если просто добавить такой ме тод в новый класс, то компилятор выдаст предупреждение о том, что новый метод скрыва ет метод  базового класса с тем же именем. Для устранения этой  ошибки в новом  методе укажите директиву reintroduce:type

TSomeBase = class

procedure Cooper;

end;

TSomeClass = class

procedure Cooper; reintroduce;

end;

Указатель Self

Во всех методах  объекта доступна  неявная переменная Self, представляющая собой  указатель  на тот  экземпляр объекта, который был  использован при  данном вызове этого  метода.  Переменная Self передается методу компилятором в качест ве скрытого параметра.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии