logo
Лекции програм_new_последняя версия1

Перезагрузка методов.

Четвертая группа методов – перезагружаемые (Overload). Заметим, что и виртуальные и динамические методы могут быть перезагружаемыми. Перезагрузка нужна, чтобы произвести одинаковые или похожие действия с разнотипными данными. Статический метод перекрытия приводит к тому, что потомок «не видит» перекрытый родительский метод и может обращаться к нему только с помощью слова inherited, поэтому в Delphi используется перезагрузка, с помощью которой становятся видны одноименные методы как родителя, так и потомка.

Пример:

Type TFirst=class

i:Extended;

procedure SetData(x:Extended);

end;

TSecond=class(TFirst)

j:Integer;

procedure SetData(AValue:Integer);

end;

. . . . .

var T2:TSecond;

. . . . .

begin

T2.SetData (1.1); (1)

T2.SetData (1); (2)

В этом примере первый вызов метода SetData из объекта T2 с переменной =1.1 (не целая) вызовет ошибку! А второй вызов не приводит к ошибке, т.к. внутри объекта T2 статический метод с параметром типа Extended перекрыт одноименным методом с параметром типа Integer. Компилятор внутри T2 не признает параметр типа Extended.

Для доступа к методу SetData класса TFirst необходимо использовать служебное слово inherited. Например:

procedure TSecond.SetData;

begin

x :=1.1;

inherited SetData (x);

j:=x;

end;

Но нам нужно произвести схожие действия (1), (2) с разнотипными данными в строках одной программы.

Может быть, метод сделать виртуальным?

Нет, нельзя! Поскольку тип и количество параметров в одном и том же виртуальном методе должны в точности совпадать.

Начиная с версии Delphi4 появилась возможность перезагрузить методы (overload), это позволяет видеть одноименные методы как родителя, так и потомка. Чтобы одноименные методы можно было отличить друг от друга, каждый из них должен иметь уникальный набор параметров. В ходе компиляции при обращении к одному из одноименных методов компилятор проверяет тип и количество параметров обращения и на основе этой проверки выбирает нужный метод.

Overload – директива, позволяющая перезагрузить методы:

Type TFirst=class

i:Extended;

procedure SetData(x:Extended); Overload;

end;

TSecond=class(TFirst)

j:Integer;

procedure SetData(AValue:Integer); Overload;

end;

. . . . .

var T2:TSecond;

. . . . .

Теперь в программе можно использовать метод как родителя, так и потомка.

begin

T2.SetData (1.1);

T2.SetData (1);

Можно перезагрузить и виртуальный, и динамический методы. В этом случае надо добавить директиву reintroduce перед директивой overload.