
Абстрактные методы и абстрактные классы
Абстрактный метод - это виртуальный или динамический метод, реализация которого не определена в том классе, в котором он объявлен. Предполагается, что этот метод будет перегружен в классах-наследниках. Только в тех классах, в которых он перегружен, его и можно вызывать. Объявляется абстрактный метод с помощью ключевого слова abstract после ключевого слова virtual или dynamic. Например:
procedure DoSomething; virtual; abstract;
Если в классе есть хотя бы один абстрактный метод, данный класс считается абстрактным классом. Объект такого класса нельзя создавать. Создавать можно только объекты наследников этого класса, в которых реализованы все абстрактные методы родительского класса. Абстрактный класс можно рассматривать в качестве интерфейса к семейству классов, порождённому им, но, в отличие от классического интерфейса, абстрактный класс может иметь определённые методы, а также свойства.
Любой метод (и статический, и виртуальный) может быть перегружен с помощью ключевого слова overload. Для виртуальных методов в этих случаях надо еще добавить ключевое слово reintroduce. Если перегруженные таким образом методы различаются числом или типом параметров (так называемой сигнатурой), то при вызове метода из класса-наследника будет вызываться тот метод, список параметров которого соответствует списку аргументов. Например:
type Tl = class (TObject)
procedure Test(I: Integer); overload; virtual;
end;
Т2 = class (Tl)
procedure Test(S: string); reintroduce; overload;
end;
var SomeObject: T2;
begin
SomeObject := T2.Create;
SomeObject.Test('Hello!'); // вызывается T2.Test
SomeObject.Test(7); // вызывается Tl.Test
end;
При реализации метода, переопределенного любым способом в классе-наследнике, можно вызывать метод класса-родителя. Для этого перед именем метода при его вызове записывается ключевое слово inherited. Например, оператор
inherited Create( ... );
вызывает метод Create родителя.
Если записать слово inherited и после него не писать имя вызываемого метода, то будет вызываться наследуемый метод, совпадающий по имени с именем того метода, из которого он вызывается. Например, если в переопределяемом конструкторе встречается оператор inherited, то будет вызван конструктор родительского класса.
Конструкторы
В объявлении класса невозможно задать значения полей по умолчанию. Единственным способом задания начальных значений полей – использование конструктора. Конструктор создает объект выделением для него памяти в динамически распределяемой области памяти. Объявление конструктора выглядит так же, как объявление процедуры, но предваряется ключевым словом constructor. В качестве имени конструктора обычно задают имя Create. В реализации конструктора обычно первым идет вызов наследуемого конструктора с помощью ключевого слова inherited. В результате инициализируются все наследуемые поля. При этом порядковым типам в качестве начального значения задается 0, указателям и ссылкам – nil, строки задаются пустыми, а поля типа variant - Unassigned. Затем инициализируются новые поля, введенные в данном классе.