«Ни один ремесленник, который стремится к вершинам своей профессии, не примет негодных инструментов; и ни один производитель, который ценит качество работы, не будет упрашивать ремесленника принять их»
19. Перегрузка подпрограмм
В одной и той же области видимости описаний (scope) можно объявить несколько подпрограмм с одним и тем же именем (overloading routines). Эти подпрограммы должны иметь отличающиеся списки формальных параметров и директиву overload. Пример:
function Divide(X, Y: Real): Real; overload;
begin
Result := X/Y;
end;
function Divide(X, Y: Integer): Integer; overload;
begin
Result := X div Y;
end;
Теперь при вызове функции Divide компилятор выбирает ту или иную ее реализацию в соответствии с типами фактических параметров.
Списки формальных параметров перегружаемых подпрограмм должны отличаться по числу или типам. Таким образом, следующая пара описаний вызовет ошибку компиляции:
function Cap(S: string): string; overload;
procedure Cap(var Str: string); overload;
В то же время описания
function Func(X: Real; Y: Integer): Real; overload;
function Func(X: Integer; Y: Real): Real; overload;
являются допустимыми.
Если перегружаемые подпрограммы имеют параметры по умолчанию (default parameters) надо проявлять осторожность для того, чтобы не было неоднозначности. При вызове перегружаемой подпрограммы можно указывать ее уточненное имя для того, чтобы избежать нежелательных эффектов, например, Unit1.MyProcedure(X,Y). Если при этом в модуле Unit1 не окажется нужной подпрограммы, компилятор сообщит об ошибке. Перегрузку подпрограмм можно также применять к методам объектов.
«18. Описания подпрограмм»
20. Параметры подпрограмм