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

Локальные процедуры и функции

Локальной функцией или процедурой называется подпрограмма, которая описана внутри другой подпрограммы. Рассмотрим пример:

procedure TForm1.Button1Click(Sender:TObject);

var

X : Integer;

{ Локальная процедура }

procedure Test;

begin

Memo1.Lines.Add(Локальная процедура, X =  + IntToStr(X));

end;

begin

X := 100;

Memo1.Lines.Clear;

Memo1.Lines.Add(Основная процедура, X =  + IntToStr(X));

Test;

end;

Обратите внимание на то, что описание процедуры Test находится в разделе объявления переменных метода Button1Click. Процедура Test называется локальной постольку поскольку ее описанием владеет другая процедура. Локальная процедура доступна только ее владельцу.

Важным свойством локальных подпрограмм является то что им доступны любые переменные своего владельца. В нашем примере переменная X доступна как подпрограмме Button1Click, так и локальной процедуре Test. Если выполнить код, показанный выше, компонент Memo1 отобразит следующий текст:

Основная процедура, X = 100

Локальная процедура, X = 100

Перегрузка подпрограмм

Часто возникает необходимость выполнения одних и тех же действий над данными различных типов. Например, стандартная функция извлечения квадратного корня Sqrt возвращает значение, тип которого совпадает с типом аргумента целого или вещественного. Object Pascal, начиная с Delphi 4, предоставляет разработчикам объявлять одноименные функции и процедуры, принимающие аргументы различных типов. Это называется перегрузкой функций.

Новый термин. Перегрузка методов позволяет объявить две (и более) процедуры (или функции) с одинаковыми именами, но с различными списками параметров.

Выше мы рассмотрели пример программы с функцией Multiply, которая возвращает результат перемножения двух целых чисел. Допустим, что нам необходимо иметь также и функции, которые перемножают числа типа Double или Word.

Благодаря перегрузке, объявления соответствующих функций принимают вид:

function Multiply(Num1, Num2 : Integer) : Integer; overload;

function Multiply(Num1, Num2 : Double) : Double; overload;

function Multiply(Num1, Num2 : Word) : Word; overload;

Все функции имеют одно и то же имя (Multiply), но в их объявлении присутствует директива overload. Код реализации каждой из этих функций необходимо привести в секции implementation модуля, где они объявлены. При этом не надо обращать внимание на то, что эти функции выполняют одни и те же действия:

implementation

function Multiply(Num1, Num2 : Integer) : Integer; overload;

begin

Result := Num1 * Num2;

end;

function Multiply(Num1, Num2 : Double) : Double; overload

begin

Result := Num1 * Num2;

end;

function Multiply(Num1, Num2 : Word) : Word; overload;

begin

Result := Num1 * Num2;

end;

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

var

X, Y, Z : Double;

begin

X := 1.5;

Y := 10.5;

Z := Multiply(X, Y);

end;

будет вызвана та версия функции Multiply, которая «принимает» параметры типа Double.

ПРИМЕЧАНИЕ: В качестве критерия выбора нужной версии перегружаемой функции компилятор использует список ее фактических параметров. Перегружаемая функция обязательно должна иметь параметры. Так, следующие объявления не допускаются

function DoSomething : Integer; overload;

function DoSomething : Word; overload;

В данной ситуации компилятор выдаст сообщение «Declaration of DoSomething differs from previous declaration».

Принцип перегрузки применим к процедурам, функциям и к методам объектов.