Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Для переопределения метода, реализованного в объекте-родителе, следует:
· указать его заголовок в интерфейсной части описания дочернего класса без изменения имени, списка параметров и возвращаемого значения (если метод является функцией);
· указать после заголовка метода ключевое слово override. Если ключевое слово override не указано, то метод не переопределяется.
· реализовать метод (создать программный код) в описательной части объекта по обычным правилам. При этом в заголовке метода ключевое слово override не указывается.
Чтобы метод мог быть переопределен в дочерних классах, он должен быть помечен ключевыми словами virtual или dynamic в интерфейсной части класса-родителя. Ключевое слово virtual указывает на то, что метод должен быть занесен в так называемую таблицу виртуальных методов (ТВМ), а ключевое слово dynamic на то, что метод должен быть найден по имени в дереве родительских объектов.
Разница между использованием virtual и dynamic заключается в направлении оптимизации компилятором вызовов переопределяемых методов. Методы, помеченные virtual, оптимизируются по скорости, а dynamic-методы по размеру программного кода. В большинстве случаев рекомендуется использование виртуальных методов, а использование динамических методов целесообразно при высоких степенях вложенности связей родитель-наследник.
Приведем описание класса TwoNums с двумя свойствами а и b, и методом GetResult, возвращающим сумму свойств. Далее от этого класса опишем наследника ThreeNums, имеющего уже три свойства — а, b и с, и переопределяющего метод GetResult таким образом, чтобы возвращать сумму не двух, а трех чисел (листинг 3.10).
Листинг 3.10. Использование переопределения
Unit Overriding1;
Interface
Type
TwoNums == class
public {Заголовок класса TwoNums}
a, b: Integer; (Описание двух свойств}
function GetResult: Integer; virtual;
{Описание заголовка метода; после описания указано
ключевое слово virtual, то есть этот метод может быть
переопределен в дочернем классе}
End;
ThreeNums = class (TwoNums)
public {Заголовок класса ThreeNums, в скобках после ключевого
слова class указан класс-родитель}
с: Integer; {Описание свойства с. Свойства а и b наследуются от
класса-родителя TwoNums}
function GetResult: Integer; override;
{Описание заголовка метода, идентичного заголовку
объекта-родителя; после описания указано ключевое слово
override, указывающее на переопределение функциональности
родительского метода}
End;
Implementation
function TwoNums.GetResult: Integer;
{Описание метода GetResult класса TwoNums}
Begin
Result:= a + b; {Результат функции — сумма двух свойств}
end;
function ThreeNums.GetResult: Integer;
{Описание переопределенного метода GetResult класса
ThreeNums}
Begin
Result:= a + b + c;
{Результат функции — сумма трех свойств}
end;
End.
Дата публикования: 2014-11-02; Прочитано: 356 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!