- •Принципы объектно-ориентированного программирования.
- •Структура класса.
- •Свойства.
- •Статические и виртуальные методы.
- •Перезагружаемые методы.
- •Конструкторы и деструкторы.
- •Интегрированная среда разработки Delphi.
- •Визуальные средства разработки.
- •Программирование с управлением по событиям.
- •Абстрактный метод.
- •Методы класса.
- •Исключительные ситуации.
- •Атрибуты доступа в Delphi.
- •Обработка исключительных ситуаций.
- •Библиотека визуальных компонентов в Delphi (vcl).
- •Ссылки на классы.
- •Указатели на методы.
- •Фреймы и шаблоны компонентов.
- •Delphi 2009: отличия от предыдущих версий.
- •Классы и модули.
- •Модули и программы.
- •Информация о типе во время выполнения.
- •Полиморфизм и виртуальные методы.
Свойства.
Помимо полей и методов в объектах существуют свойства. При работе с объектом свойства выглядят как поля: они принимают значения и участвуют в выражениях. Но в отличие от полей свойства не занимают места в памяти, а операции их чтения и записи ассоциируются с обычными полями или методами. Это позволяет создавать необходимые сопутствующие эффекты при обращении к свойствам. Например, в объекте 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).
Статические и виртуальные методы.
Методы класса могут перекрываться в потомках. Например:
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 у любого из своих потомков. Динамическое связывание в полной мере реализует полиморфизм классов.
Раннее связывание – размещение ссылок на методы на этапе компиляции; сами методы называются статическими.
Позднее связывание - размещение ссылок на методы при выполнении программы (а не при компиляции), а сами методы называются виртуальными.
Таблицы виртуальных и динамических методов.
Таблица виртуальных методов (VMT)
Для виртуальных методов, объявленных в классе, на этапе компиляции в сегменте данных создается особый информационный блок - таблица виртуальных методов (Virtual Method Table, далее VMT), содержащая список указателей на подпрограммы, реализующие эти методы.
Каждый экземпляр этого типа включает в себя указатель на эту таблицу (в объекте используется дополнительная память для ссылки на VMT).
Организация связи объектов с VMT является одной из функций конструктора, поэтому конструктор всегда должен вызываться до вызова виртуальных методов.
Все вызовы виртуальных методов происходят через VMT.
Обращение к VMT через объект происходит с помощью скрытого параметра SELF, который указывает на объект, вызвавший виртуальный метод, и посылается методу при его вызове.
Виртуальные и динамические методы
Существует два подкласса виртуальных методов: виртуальные (VIRTUAL) и динамические (DYNAMIC) методы, для которых компилятор создает таблицы виртуальных и динамических методов соответственно.
-В таблице виртуальных методов (Virtual Method Table, VMT) содержаться адреса VIRTUAL-методов данного класса и всех его родителей. Данная таблица имеет большой размер, но обеспечивает более быстрый, чем у динамических методов, поиск.
-В таблице динамических методов (Dynamic Method Table, DMT) содержаться только ссылки на методы класса данного объекта. Использование таких таблиц позволяет сэкономить память, но замедляет обращение к этим методам, поскольку поиск методов может производиться не только в DMT текущего класса, но и в DMT его предков, до тех пор, пока не будет найдена нужная точка входа в подпрограмму.