Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.doc
Скачиваний:
18
Добавлен:
25.12.2018
Размер:
683 Кб
Скачать
☆

Var SomeObject: t1;

Begin

SomeObject:=T2.Create;

SomeObject.Test; // Вызывается T1.Test

• У каждого производного класса свое пространство имен, предваряю­щее пространство имен всех наследуемых этим классом методов. Поэтому можно скрыть наследуемый метод, объявив одноименный виртуальный ме­тод. Однако в VMT таблице сохраняется адрес нового и старого (переопределенного) виртуального метода, следовательно, к переопределен­ному виртуальному методу возможен доступ с использованием механизма приведения типов:

TParentClass(Obj). <метод>;

Синтаксис объявления виртуальных методов:

Procedure|Constructor|Destructor <имя метода>[(<параметры>)};

Virtual;

Function <имя метода>[(<параметры>)]: <тип результатам>; Virtual;

в) Динамические методы.

Динамические методы вызываются медленнее виртуальных, но позво­ляют более экономно расходовать память. Каждому динамическому методу присваивается индекс - отрицательное число. В таблице динамических мето­дов (Dynamic Method Table, DMT) класса хранятся индексы и адреса только тех динамических методов, которые описаны в данном классе. Если в DMT данного класса адрес нужного динамического метода не находится, то про­сматривается DMT класса-предка, и так далее по всей цепочке наследования до класса TObject. Таким образом, доступ к методу через DMT может при­вести к активному поиску в DMT разных классов и потребовать сотен тактов процессора.

Во всем остальном между виртуальными и динамическими методами нет принципиальной разницы. Там, где можно использовать виртуальный метод, там можно использовать и динамический, но с меньшими затратами памяти и быстродействием. Динамические методы используются для редко вызывае­мых методов, когда потерями в производительности можно пренебречь. Синтаксис объявления динамических методов:

Proctdure <имя метода>[(<параметры>)}; Dynamic;

Function <имя метода>[(<параметры>)}: <тип результата>;Т>упят.1С;

Редко перекрываемые методы рекомендуется делать динамическими.

г) Замещающие методы.

В то время как, директивы Virtual и Dynamic всегда вводят новое имя ме­тода, то директива Override всегда указывает на новую реализацию уже суще­ствующего наследуемого виртуального или динамического метода. Весь смысл виртуальных и динамических методов состоит в том, чтобы дать клас­су-потомку возможность модифицировать поведение метода, введенного в его классе-предшественнике. Директива Override служит для того, чтобы дать понять транслятору, что ваша цель - модифицировать (заменить или расши­рить - два разных варианта) реализацию наследуемого метода.

Объявление Override-метода должно в точности совпадать с объявлени­ем исходного Virtual или Dynamic метода по названию, числу, именам и ти­пам параметров, а также типу результата для функции. Новая строка в VMT (DMT) таблице не создается, поскольку адрес замещенного метода записыва­ется в строку таблицы замещаемого метода. Таки" образом, у класса-предка и класса-потомка адрес одноименного метода находится в строке таблицы VMT (DMT) с одинаковым смещением от ее начала. Однако "начинка" этих методов различна.

Синтаксис объявления замещающих виртуальных методов:

Procedure|Constructor|Destructor <имя метода>[(<параметры>)];Override;

Function <имя метода>[{<параметры>)]: <тип результата>; Override;;

Если в одноименных статических методах производных классов списки параметров могут различаться, то список параметров виртуального метода нельзя изменять при замещении в производном классе. Это объясняется тем, что нет никакой связи между одноименными статическими методами произ­водных классов, и есть сильная связь между одноименными виртуальными методами. Так вызов виртуального метода может во время работы програм­мы привести к вызову любой из его реализации (принцип полиморфизма) в производных классах, поэтому у них у всех должны быть идентичные списки параметров.

д) Абстрактные методы.

Абстрактными называются методы, которые определены в классе, но не содержат его реализации в этом классе. Они никогда не вызываются в объяв­ленном классе и должны быть переопределены и реализованы в его наслед никах. Абстрактными могут быть только виртуальные и динамические мето­ды. Их основное назначение, - абстрагируясь от частностей, быть родона­чальниками иерархии конкретных методов в классах наследниках. Такие ме­тоды лежат в основе принципа полиморфизма. Для объявления метода абст­рактным используется слово-директива Abstract, которое указывается после слова-директивы Virtual (Dynamic). Эта директива действительна лишь при первом объявлении метода класса. Если абстрактный метод в наследниках оказался неопределенным, то его вызов генерирует ошибку или исключи­тельную ситуацию.

Синтаксис объявления абстрактных методов:

Procedure <имя метода>[(<параметры>)]; Virtual; Abstract;

Function <имя метода>[(<параметры>)]: <тип результата>;