6.5.3 Виртуальные методы |
Вверх Предыдущий Следующий |
Классы, так же, как объекты могут иметь виртуальные методы. Однако между ними существует разница. Для объекта, достаточно пере объявить метод в объекте потомке с ключевым словом virtual, чтобы заменить его. Для класса, ситуация иная: виртуальные методы должны быть перекрыты с ключевым словом override. Несоблюдение этого правила, начнет новую серию виртуальных методов, скрывая предыдущую. Ключевое слово Inherited не будет вызывать метод предка, если были использованы virtual (виртуальные) методы. Следующий код является неправильным: Type ObjParent = Class Procedure MyProc; virtual; end;
ObjChild = Class(ObjPArent) Procedure MyProc; virtual; end; Компилятор выдаст предупреждение: Warning: An inherited method is hidden by OBJCHILD.MYPROC Внимание: унаследованный метод скрыт OBJCHILD.MYPROC Это код будет компилироваться, но с Inherited (унаследованными) методами будут происходить странные вещи. Правильным объявлением классов, будет так: Type ObjParent = Class Procedure MyProc; virtual; end;
ObjChild = Class(ObjPArent) Procedure MyProc; override; end; Этот код будет компилироваться и запускаться без предупреждений или ошибок. Если виртуальный метод действительно следует заменить методом с тем же именем, то нужно использовать ключевое слово reintroduce: Type ObjParent = Class Procedure MyProc; virtual; end; ObjChild = Class(ObjPArent) Procedure MyProc; reintroduce; end; Метод MyProc больше не быдет виртуальным. Для того, чтобы быть в состоянии сделать это, компилятор сохраняет для каждого класса - таблицу с виртуальных методов:VMT (Virtual Method Table ). Это таблица с указателями на каждый из виртуальных методов: каждый виртуальный метод имеет фиксированное положение в этой таблице (индекс). Компилятор использует эту таблицу, чтобы определить, какой метод будет фактически использоваться во время выполнения. Когда объект потомка переопределяет метод, в VMT переписывается родительский метод. Более подробную информацию о VMT можно найти в Справочник программиста Free Pascal.
|