Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 семестр.doc
Скачиваний:
5
Добавлен:
02.08.2019
Размер:
137.73 Кб
Скачать
  1. Свойства.

Помимо полей и методов в объектах существуют свойства. При работе с объектом свойства выглядят как поля: они принимают значения и участвуют в выражениях. Но в отличие от полей свойства не занимают места в памяти, а операции их чтения и записи ассоциируются с обычными полями или методами. Это позволяет создавать необходимые сопутствующие эффекты при обращении к свойствам. Например, в объекте Reader присваивание свойству Active значения True вызовет открытие файла, а присваивание значения False — закрытие файла. Создание сопутствующего эффекта (открытие или закрытие файла) достигается тем, что за присваиванием свойству значения стоит вызов метода.

Объявление свойства выполняется с помощью зарезервированного слова property, например:

type

TDelimitedReader = class

...

FActive: Boolean;

...

// Метод записи (установки значения) свойства

procedure SetActive(const AActive: Boolean);

property Active: Boolean read FActive write SetActive; // Свойство

end;

Ключевые слова read и write называются спецификаторами доступа. После слова read указывается поле или метод, к которому происходит обращение при чтении (получении) значения свойства, а после слова write — поле или метод, к которому происходит обращение при записи (установке) значения свойства. Например, чтение свойства Active означает чтение поля FActive, а установка свойства — вызов метода SetActive.

Обращение к свойствам выглядит в программе как обращение к полям:

var

Reader: TDelimitedReader;

IsOpen: Boolean;

...

Reader: TDelimitedReader.Create;//Обязательное обращение к конструктору перед обращением к полю или свойству.

Reader.Active := True; // Эквивалентно Reader.SetActive(True);

IsOpen := Reader.Active; // Эквивалентно IsOpen := Reader.FActive

Если один из спецификаторов доступа опущен, то значение свойства можно либо только читать (задан спецификатор read), либо только записывать (задан спецификатор write).

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

Методы класса могут перекрываться в потомках. Например:

Type

TParentClass = class

Procedure DoWork;

end;

TChildClass = class(TParentClass)

Procedure DoWork;

end;

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

В Delphi гораздо чаще используется динамическое перекрытие методов на этапе прогона прогрыммы. Для реализации этого метода, перекрываемый в родительском классе, должен объявляться как динамический (с директивой dynamic) или виртуальный (virtual). Встретив такое объявление компилятор создаст дву таблицы – DMT и VMT и поместит в них адреса точек входа соответственно динам. и вирт. методов. При каждом обращении к перекрываемому методу компилятор вставляет код, позволяющий извлечь из той или иной таблицы адрес точки входа в программу. В классе-потомке перекрываемый метод объявляется с директивой override.

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

Type

TVisualObject = class(TWinControl)

Procedure Hide;

Procedure Show

Procedure Draw(IsShow: Boolean);virtual;

end;

TVisualChildObject = class(TVisualObject)

Procedure Draw (IsShow: Boolean);override;

end;

Реализация методов Show и Hide :

Procedure TVisualObject.Show;

begin

Draw(True);

end;

Procedure TVisualObject.Hide;

begin

Draw(False);

end;

Методы Draw у родителя и потомка имеют разную реализацию и создают разные изображения. В результате родительские методы Show и Hide будут прятать или показывать те или иные изображения в зависимости от конкретной реализации метода Draw у любого из своих потомков. Динамическое связывание в полной мере реализует полиморфизм классов.

Раннее связывание – размещение ссылок на методы на этапе компиляции; сами методы называются статическими.

Позднее связывание - размещение ссылок на методы при выполнении программы (а не при компиляции), а сами методы называются виртуальными.

  1. Таблицы виртуальных и динамических методов.

Таблица виртуальных методов (VMT)

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

Каждый экземпляр этого типа включает в себя указатель на эту таблицу (в объекте используется дополнительная память для ссылки на VMT).

Организация связи объектов с VMT является одной из функций конструктора, поэтому конструктор всегда должен вызываться до вызова виртуальных методов.

Все вызовы виртуальных методов происходят через VMT.

Обращение к VMT через объект происходит с помощью скрытого параметра SELF, который указывает на объект, вызвавший виртуальный метод, и посылается методу при его вызове.

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

Существует два подкласса виртуальных методов: виртуальные (VIRTUAL) и динамические (DYNAMIC) методы, для которых компилятор создает таблицы виртуальных и динамических методов соответственно.

-В таблице виртуальных методов (Virtual Method Table, VMT) содержаться адреса VIRTUAL-методов данного класса и всех его родителей. Данная таблица имеет большой размер, но обеспечивает более быстрый, чем у динамических методов, поиск.

-В таблице динамических методов (Dynamic Method Table, DMT) содержаться только ссылки на методы класса данного объекта. Использование таких таблиц позволяет сэкономить память, но замедляет обращение к этим методам, поскольку поиск методов может производиться не только в DMT текущего класса, но и в DMT его предков, до тех пор, пока не будет найдена нужная точка входа в подпрограмму.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]