Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Pascal / Delphi / Руководство по Borland Pascal.doc
Скачиваний:
45
Добавлен:
02.05.2014
Размер:
2.05 Mб
Скачать

Статические методы или виртуальные методы?

В общем случае, вам следует делать методы виртуальным. Ис-

пользуйте статические методы только в том случае, если вы хотите

получить оптимальную эффективность скорости выполнения и исполь-

зования памяти. Однако в этом случае, как вы видели, вы теряете

возможности расширения.

Предположим, что вы описываете объект с именем Ancestor и

внутри этого объекта вы описываете метод с именем Action. Как вы

определяете, каким должен быть метод, виртуальным или статичес-

ким? Здесь приводится правило большого пальца: сделайте метод

Action виртуальным, если имеется вероятность, что будущие наслед-

ники объекта Ancestor будут переопределять Action, а вы хотите,

чтобы будущий код был доступен Ancestor.

С другой стороны, помните, что если у объекта имеются любые

виртуальные методы, то для этого объекта в сегменте данных будет

создана таблица виртуальных методов (ТВМ) и каждый экземпляр это-

го объекта будет иметь связь с ТВМ. Каждый вызов виртуального ме-

тода должен проходить через ТВМ, тогда как статические методы вы-

зываются непосредственно. Хотя просмотр ТВМ является весьма эф-

фективным, вызов статического метода все равно остается немного

более быстрым, чем вызов виртуального. И если в вашем объекте нет

виртуальных методов, то и ТВМ отсутствует в сегменте данных и

(что более важно) в каждом экземпляре объекта отсутствуют связи с

ТВМ.

Дополнительная скорость и эффективное использование памяти

для статических методов должно уравновешиваться гибкостью, кото-

рую допускают виртуальные методы: вы можете расширить имеющийся

код спустя много времени после его компиляции. Помните, что поль-

зователь вашего типа объекта может рассматривать пути его исполь-

зования, которые вам и не снились, что, в конечном счете, имеет

основное значение.

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

Все приведенные до сих пор объекты имели статические реали-

зации типов объектов, которым в объявлении var присваивались име-

на и которые размещались в сегменте данных или в стеке.

var

ASalaried: TSalaried;

Примечание: Использование здесь слова "статический" не

имеет отношения к статическим методам.

Объекты могут размещаться в динамической памяти и ими можно

манипулировать с помощью указателей, как и с тесно связанными с

ними типами записей, что всегда имело место в Паскале. Турбо Пас-

каль включает несколько мощных расширений для выполнения динами-

ческого размещения и удаления объектов более легкими и более эф-

фективными способами.

Объекты могут размещаться, как области памяти, на которые

ссылается указатель, с помощью процедуры New:

var

CurrentPay: Real;

P: ^TSalaried;

New(P);

Как и для типов записей, процедура New выделяет в динамичес-

кой памяти пространство, достаточное для размещения реализации

указателя базового типа и возвращает адрес этого пространства в

указателе.

Если динамический объект содержит виртуальные методы, то он

должен инициализироваться с помощью вызова конструктора перед

тем, как будет вызван любой из его методов:

P^.Init('Sara Adams', 'Account manager', 2400);

Затем вызовы методов могут происходить в обычном порядке, с

использованием имени указателя и ссылочного символа вместо имени

реализации, которое использовалось бы при обращении к статически

размещенному объекту:

CurrentPay := P^.GetPayAmount;

Соседние файлы в папке Delphi