Отчет по практике: Основы программирования в среде Delphi
Если требуется переопределить виртуальный метод, он описывается с ключевым словом override, а не virtual. Если же указать в потомке слово virtual, это будет воспринято компилятором как начало новой иерархии виртуальных методов.
Конструктор в Delphi может быть виртуальным, поскольку он размещает объект в динамической памяти только при первом вызове, а во время всех последующих вызовов выполняется как обычный метод.
В классах, предназначенных для создания не объектов, а потомков, разрешается определять методы с ключевым словом abstract. Для таких методов реализация задается только в потомках класса. Класс, содержащий хотя бы один абстрактный метод, называется абстрактным. Создавать экземпляры объектов такого класса запрещается, а в потомках, предназначенных для создания объектов, все абстрактные методы надо обязательно переопределить. Абстрактные методы предназначены для задания общего интерфейса иерархии.
При переопределении обычных методов в производном классе непосредственный доступ к одноименному методу предка невозможен. Чтобы обойти это ограничение, при описании метода потомка можно задать ключевое слово overload (перегруженный). У перегруженных методов должен различаться список параметров, поскольку именно по типам аргументов компилятор выбирает, какой из одноименных методов вызвать. Перегруженные методы не могут объявляться в одном и том же классе – только в предке и потомке, например:
type
a = class
procedure max(a,b:integer):overload;
end;
b = class(a)
procedure max(a:real; b:integer; s:char):overload;
end;
…
var
x:b;
…
x.max(20,3); {вызывается метод из класса a}
x.max(0.1,10,’u’); {вызывается метод из класса b}
Виртуальные методы также можно перегружать, но при этом становится невозможным доступ к методу предка и компилятор выдает предупреждение. Чтобы подтвердить компилятору свои намерения, можно использовать ключевое слово reintroduce. Рассмотрим варианты переопределения виртуальных методов на примере:
type
a = class
procedure p1; virtual;
procedure p2; virtual;
procedure p3; virtual;
procedure p4; virtual;
procedure p5; virtual;
end;
b = class(a)
procedure p1;
procedure p1; reintroduce;