Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi_02_05 [2012].doc
Скачиваний:
9
Добавлен:
29.08.2019
Размер:
84.99 Кб
Скачать

Абстрактные методы и абстрактные классы

Абстрактный метод - это виртуальный или динамический метод, реализация которого не определена в том классе, в котором он объявлен. Предполагается, что этот метод будет перегружен в классах-наследниках. Только в тех классах, в которых он перегружен, его и можно вызывать. Объявляется абстрактный метод с помощью ключевого слова 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. Затем инициализируются новые поля, введенные в данном классе.

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