* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Процедурные типы
15 апреля 2009
В языке Delphi процедуры и функции рассматриваются не только как части програм- мы, которые можно выполнять с помощью вызовов, а трактуются гораздо шире: здесь до- пускается интерпретация процедур и функций как объектов, которые можно присваивать переменным и передавать в качестве параметров. Такие действия можно выполнять с помощью процедурных типов. В описании процедурного типа задаются парамет- ры, а для функции еще и возвращаемое значение. По существу синтаксис записи процедурного типа в точности совпадает с записью заголовка процедуры или функции, только опускается идентификатор после ключе- вого слова procedure или function. Приведем несколько примеров объявлений процедурного типа.
type Proc = procedure; SwapProc = procedure(var X, У: Integer); StrProc = procedure(S: String); MathFunc = function(X: Real): Real; DeviceFunc = function(var F: Text): Integer; MaxFunc = function(A, B: Real; F: MathFunc): Real; Имена параметров в описании процедурного типа играют чисто декоративную роль — на смысл описания они не влияют. Язык Delphi не позволяет описывать функции, которые возвращают значения про- цедурного типа. Результат функции должен быть указателем строкового, веществен- ного, целого, символьного, булевого типа или иметь перечислимый тип, определен- ный пользователем. Рассмотрим небольшой пример. Объявляем следующую функцию. function Calc(X,Y: Integer): Integer; Затем объявляем переменную F. var F: function(X,Y: Integer): Integer; И присваиваем ей ссылку на функцию. F := Calc; С этой переменной можно поступать точно так же, как и с остальными переменны- ми, ее можно применять и для вызова функций. Вот как это происходит в программе. function Calc(х,у:Integer): Integer; begin Result := X + Y; end; type F = function (X,Y:Integer): Integer; var Pfunc: F; begin Pfunc := Calc; Writeln(Pfunc(2,3)); Readln; end. Сначала описана функция Calc, в которой выполняется сложение двух чисел, за- тем объявлен процедурный тип F и создана процедурная переменная pfunc, которой в дальнейшем присваивается ссылка на функцию Calc. Вывод на экран в выражении writeln(pfunc(2, 3)) ,- производится с помощью процедурной переменной pfunc. На экране появится цифра 5. Наверно, некоторые задумаются, зачем так усложнять программу, ведь можно не- посредственно сделать вывод самой функции, не делая дополнительные преобразова- ния. Все дело в том, что различных функций может быть сколь угодно много, и тогда для вывода каждой функции придется отдельно вызывать функцию write с соответ- ствующими параметрами. Но присваивание функций процедурной переменной по- зволяет использовать только одну форму вывода Writeln (pfunc (X, Y));, что делает программу более понятной, позволяет сократить ее и исключить возможные ошибки. Использование процедурных переменных позволяет во многих случаях улучшить наглядность программы и, соответственно, сделать ее более надежной.