Замещение методов предполагает передачу и изменение методов от класса-предка классу-наследнику. Как мы уже отметили, только виртуальные или динамические методы могут быть замещенными. Рассмотрим пример:
type
TComponentParent = class
procedure MyProcVirtual; virtual;
procedure MyProcDynamic; dynamic;
end;
TComponentChild = class(TComponentParent)
procedure MyProcVirtual; override;
procedure MyProcDynamic; override;
end;
Применение служебного слова override после названия метода позволяет заместить оригинал метода класса-предка методом класса-наследника. При этом замещение происходит непосредственно в таблице виртуальных методов (или таблице динамических методов). При использовании служебных слов virtual или dynamic вместо override произойдет создание нового метода вместо замещения старого.
Замещение методов не работает со статическими методами — при замещении статического метода новым произойдет простая замена метода родителя в потомке.
Абстрактными методами называются такие методы, которые описаны внутри определения класса или компонента, но не содержат никаких действий и никогда не вызываются и соответственно не имеют реализации. Абстрактными могут быть виртуальные или динамические методы. Абстрактные методы используются только в классах-предках. Описание абстрактного метода выглядит следующим образом:
procedure MyProcedure;virtual; abstract;
Примечание
Никогда не вызывайте на выполнение абстрактные методы, т. к. они не содержат никаких команд, которые могли бы выполниться. Вызов абстрактного метода приведет к генерации исключительной ситуации EAbstractError.
Свойства так же, как и поля, определяют атрибуты объекта. Но в отличие от полей свойства реализуют механизм доступа для чтения или изменения данных в полях объекта.
Свойства позволяют изменять атрибуты объекта, в том числе, и вычисляемыми значениями. Объявление свойства объекта должно содержать его имя и тип, а также, как минимум, одно объявление способа доступа к данному свойству (описания).
Синтаксис объявления свойства объекта имеет вид:
property <Имя свойства>:<тип> <описания>;
<имя свойства> должно быть уникальным;
<тип> — определяет, значения какого типа могут быть записаны в данном свойстве;
<описания> — объявления способов доступа к данному свойству.
Каждое свойство объекта должно иметь, как минимум, одно обязательное объявление способа доступа к свойству. Имеется два обязательных описания доступа к свойству объекта: чтение (read) значения свойства и запись (write) значения свойства.
Синтаксис обязательных описаний read и write имеет следующий вид:
где <имя поля> — поле, из которого берется или в которое помещается значение свойства,
<имя метода> — метод, который берет или помещает значение свойства компонента.
Объявление read (читать) описывает поле или метод, предназначенные для чтения значения свойства, а объявление write (писать) описывает поле или метод, предназначенные для записи значения свойства компонента.
Пример описания свойств объекта:
type
TMyObject = class // Объявление нового класса
private FInt: integer; // Объявление целочисленного поля
FReal: real; // Объявление вещественного поля
FChar: char; // Объявление поля символьного типа
published property Prop1:integer read FInt write FInt;
// Объявление свойства Prop1, с помощью
// которого можно читать значение поля
// FInt и записывать данные в это же поле property Prop2:real read FRea1;
// Свойство Ргор2 предназначено
// только для чтения значения поля FReal property РrорЗ:char write FChar;
// Свойство Рrор3 предназначено
// только для записи данных в поле FChar
end;
После такого объявления программист получает доступ к полям объекта через три свойства Prop1, Prop2 и Рrор3.