Форма входа
I Love Bashorg
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Программирование » Delphi » Перегрузка методов (Объектно-ориентированное программирование)
Перегрузка методов
BombersДата: Суббота, 10.04.2010, 23:50 | Сообщение # 1
Лейтенант
Группа: Администраторы
Сообщений: 62
Репутация: 0
Статус: Offline
Перегрузка методов

Есть еще одна, совершенно особенная разновидность методов — перегружаемые.

Эту категорию методов нельзя назвать антагонистом двух предыдущих: и статические, и виртуальные, и динамические методы могут быть перегружаемыми. Перегрузка методов нужна, чтобы произвести одинаковые или похожие действия с разнотипными данными.

Рассмотрим немного измененный пример, иллюстрирующий статические методы:

type

TlstObj = class

FExtData : Extended;

procedure SetData(AValue: Extended);

end; T2ndObj = class(TlstObj)

FIntData : Integer;

procedure SetData(AValue: Integer); end;

var Tl: TlstObj;

T2 : T2ndObj;

В этом случае попытка вызова из объекта Т2 методов

...

Т2.SetData (1.0);

Т2.SetData(1);

...

вызовет ошибку компиляции на первой из двух строк. Для компилятора внутри Т2 статический метод с параметром типа extended перекрыт, и он его "не признает". Где же выход из сложившегося положения? Переименовать один из методов, например создать SetlntegerData и SetExtendedData? Можно, но если методов не два, а, скажем, сто, моментально возникнет путаница. Сделать методы виртуальными? Нельзя, поскольку тип и количество параметров в одноименных виртуальных методах должны в точности совпадать. Теперь для этого существуют перегружаемые методы, объявляемые при помощи директивы overload:

type

TlstObj = class

FExtData : Extended;

procedure SetData(AValue: Extended);overload;

end;

T2ndObj = class(TlstObj)

FIntData : Integer;

procedure SetData(AValue: Integer); overload;

end;

Объявив метод SetData перегружаемым, в программе можно использовать обе его реализации одновременно. Это возможно потому, что компилятор определяет тип передаваемого параметра (целый или с плавающей точкой) и в зависимости от этого подставит вызов соответствующего метода: для целочисленных данных — метод объекта T2ndobj, для данных с плавающей точкой — метод объекта Tistobj.

Можно перегрузить и виртуальный (динамический) метод. Надо только в этом случае добавить директиву reintroduce:

type

TlstObj = class

FExtData : Extended;

procedure SetData(AValue: Extended); overload; virtual;

end;

T2ndObj = class(TlstObj)

FIntData : Integer;

procedure SetData(AValue: Integer); reintroduce; overload;

end;

На перегрузку методов накладывается ограничение — нельзя перегружать методы, находящиеся в области видимости published, т. е. те, которые будут использоваться в Инспекторе объектов.

 
Форум » Программирование » Delphi » Перегрузка методов (Объектно-ориентированное программирование)
  • Страница 1 из 1
  • 1
Поиск:

Воскресенье, 05.05.2024, 02:41
Приветствую Вас Гость
Статистика
  • Admin icq status
    587643917
    Друзья сайта