Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Механизм переопределения



Для переопределения метода, реализованного в объекте-родителе, следует:

· указать его заголовок в интерфейсной части описания дочернего класса без изменения имени, списка параметров и возвращаемого значения (если метод является функцией);

· указать после заголовка метода ключевое слово 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; Прочитано: 355 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...