Delphi справочник - Форум программистов - Навигация  
 A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z      По первой букве  
System     SysUtils     StrUtils     DateUtils     FileCtrl     ConvUtils     StdConvs     Math     Classes     Dialogs     Types     Variants    ПО Unit   Compiler directives     Directives     Keywords     Types     Variables     Constants     Functions     Procedures    По категории  

форум программистов

Основы Delphi
Overload
Деректива
Позволяет 2-м или более подпрограммам иметь одинаковое название unit
  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

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

Function  Определяет подпрограмму, которая возвращает значение

Override  Определяет метод, который заменяет виртуальный родительский метод класса

Procedure  Определяет подпрограмму, которая не возвращает значение

 
Пример кода : Две версии класса constructor
// Полный код Модуля.
// -----------------------------------------------------------
// Вы должны поместить этот код в модуль с именем 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.
Программа выполняется без какого-либо вывода
 
Пример кода : Иллюстрация, как Delphi выбирает подпрограммы согласно значению параметра
// Полный код Модуля.
// -----------------------------------------------------------
// Вы должны поместить этот код в модуль с именем Unit1 и с формой
// названную Form1, которая имеет событие OnCreate названное FormCreate.

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  form1.close;
end;

// В строке перезагруженных функций
function MaxValue(a, b : Byte) : string; Overload;
begin
  if a > b
  then ShowMessageFmt('%d byte >  %d',[a,b])
  else ShowMessageFmt('%d byte <= %d',[a,b]);
end;

function MaxValue(a, b : Integer) : string; Overload;
begin
  if a > b
  then ShowMessageFmt('%d integer >  %d',[a,b])
  else ShowMessageFmt('%d integer <= %d',[a,b]);
end;

function MaxValue(a, b : Extended) : string; Overload;
begin
  if a > b
  then ShowMessageFmt('%f extended >  %f',[a,b])
  else ShowMessageFmt('%f extended <= %f',[a,b]);
end;

function MaxValue(a, b : string) : string; Overload;
begin
  if a > b
  then ShowMessageFmt('''%s'' string >  ''%s''',[a,b])
  else ShowMessageFmt('''%s'' string <= ''%s''',[a,b]);
end;

// Основная линия кода
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Демонстрация различных вызовов, используя то же самое название
  MaxValue(15  , 23);
  MaxValue(1500, 23);
  MaxValue(15.0, 23.0);
  MaxValue('15', '23');
end;
end.
15 byte <= 23
1500 integer > 23
15.0 extended <= 23.0
'15' string <= '23'
 


Оплата за обучение в Kata Academy только после твоего трудоустройства в IT, начни карьеру Middle Java-разработчика



Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки? Slurm подготовили для вас особенный продукт!





форум программистов


© Форум Delphi  |  Форум Pascal   |  Блог программистов   |  Исходники Delphi   |  Автор сайта  |  Ссылки   |  Английская версия