Принципиально отличаются от статических методов виртуальные и динамические методы. Они могут быть объявлены путем добавления соответствующей директивы
Общим для них является то, что при их вызове адрес определяется не во время компиляции, а во время выполнения путем поиска в специальных таблицах. Такой способ еще называется
Когда компилятор встречает обращение к виртуальному методу, он подставляет вместо обращения к конкретному адресу код, который обращается к специальной таблице и извлекает оттуда нужный адрес. Эта таблица называется таблицей виртуальных методов
Динамические методы вызываются медленнее, но позволяют более экономно расходовать память. Каждому динамическому методу системой присваивается уникальный индекс. В таблице динамических методов
Для перекрытия и виртуальных, и динамических методов служит новая директива
type
TFirstClass = class
FMyField1: Integer;
FMyField2: Longlnt;
procedure StatMethod1;
procedure VirtMethod1; virtual;
procedure VirtMethod2; virtual;
procedure DynaMethod1; dynamic;
procedure DynaMethod2; dynamic;
end;
TSecondClass = class(TFirstClass)
procedure StatMethod;
procedure VirtMethod; override;
procedure StatMethod; override;
end;
var
Obj2: TFirstClass;
Obj1: TSecondClass;
Первый из методов в примере создается заново, остальные два — перекрываются. Попытка применить
В Object Pascal абстрактными называются методы, которые определены в классе, но не содержат никаких действий, никогда не вызываются и должны быть переопределены в потомках класса. Абстрактными могут быть только виртуальные и динамические методы. Для этого используется директива
procedure NeverCallMe; virtual; abstract;
При этом никакого кода для этого метода писать не нужно. Как и ранее, вызов метода NeverCallMe приведет к ошибке времени выполнения.
7. ПОЛИМОРФИЗМ
Рассмотрим пример, которой поясняет, для чего нужно использование абстрактных методов. Пусть у нас имеются некое обобщенное поле для хранения данных — класс TField и три его потомка — для хранения строк, целых и вещественных чисел. В данном случае класс Tfield не используется сам по себе; его основное предназначение — быть родоначальником иерархии конкретных классов — "полей" и дать возможность абстрагироваться от частностей. Хотя параметр у ShowData и описан как TField, но если поместить туда объект этого класса, произойдет ошибка вызова абстрактного метода:
type
TField = class
function GetData: string; virtual; abstract;
end;
TStringField = class(TField)
Data: string;
function GetData: string; override;
end;
TIntegerField = class(TField)
Data: Integer;
function GetData: string; override;
end;
TExtendedField = class(TField)
Data: Integer;
function GetData: string; override;
end;
function TStringField.GetData;
begin
GetData:= Data;
end;
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии