Overload

Печать
Рейтинг пользователей: / 0
ХудшийЛучший 

Overload

Описание

Subroutine declaration; Overload; {Other directives...}

Директива Overload позволяет Вам иметь различные версии одинаково названной функции или процедуры с различными параметрами. Это полезно, когда есть множество путей, которыми код может захотеть использовать подпрограмму. Например, если подпрограмма - конструктор класса, Вы можете хотеть иметь одну версию Create, которая устанавливает значения по умолчанию, и другую, которая берет эти значения как параметры.

Вы должны закодировать директиву Overload перед любыми другими директивами.

При запросе перезагруженной (overloaded) подпрограммы, Delphi выбирает соответствующую версию, основанную сначала на номере параметров, затем на типах параметра. Если он не может принять решение, он выдаёт исключение.

Когда количество параметров такое же, он всегда сначала пробует удовлетворить самые простые/наименьшие типы данных - например, вышеупомянутое значение 23 удовлетворил бы параметр Byte, чем Integer параметр.

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

procedure MyProc(a : Byte; b : Byte = 23);

Может быть вызвана 2-мя способами:

MyProc(15, 16);
MyProc(45);
// Defaults b to value 23

Перегрузка не ограничена методами класса. В строках функций и процедур может быть подобно перезагружено.

Пример кода

// Полный код Модуля.
// -----------------------------------------------------------
// Вы должны поместить этот код в модуль с именем Unit1 и с формой
// названную Form1, которая имеет событие OnCreate названное FormCreate.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
// Класс с перезагруженными методами
TRectangle = class
private
coords: array[0..3] of Integer;
public
constructor Create(left, top, right, bottom : Integer); Overload;
published
// Только одна версия перезагруженного метода может быть published
constructor Create(topLeft, bottomRight : TPoint); Overload;
end;

// Сам класс формы
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// Версия 1 конструктора: берет целые числа как значения координат
constructor TRectangle.Create(left, top, right, bottom: Integer);
begin
// Сохранение переданных значений
coords[0] := left;
coords[1] := top;
coords[2] := right;
coords[3] := bottom;
end;

// Версия 2 конструктора: берет точки как значения координат
constructor TRectangle.Create(topLeft, bottomRight: TPoint);
begin
// Сохранение переданных значений
coords[0] := topLeft.X;
coords[1] := topLeft.Y;
coords[2] := bottomRight.X;
coords[3] := bottomRight.Y;
end;

// Основная линия кода
procedure TForm1.FormCreate(Sender: TObject);
var
rect1, rect2   : TRectangle;
point1, point2 : TPoint;

begin
point1 := Point(122,133);
point2 := Point(144,155);

// Создание двух прямоугольников, используя два различных конструктора
rect1 := TRectangle.Create(22, 33, 44, 55);
rect2 := TRectangle.Create(point1, point2);
end;

end.

Программа выполняется без какого-либо вывода

Примечание