
Interface type
Complex = record
re,im: real
end;
Function AddC(x,y: Complex): Complex;
Function MulC(x,y: Complex): Complex;
Implementation
Function AddC(x,y: Complex): Complex;
begin
end; Function MulC;// Вариант описания подпрограммы без
// повторения списка параметров
begin
end;
end.
Х
отя
допускается краткое объявление заголовка
подпрограммы ( как в предшествующем
примере—функции MulC), тем не менее
использовать такую форму в серьезной
программе не рекомендуется: перечень
параметров непосредственно в заголовке
подпрограммы облегчает чтения кода и
понимания деталей реализации алгоритма.
Повторение заголовка в исполняемой части должно быть полным и точным. Если бы мы использовали заголовок
Function AddC(x,z: Complex): Complex; begin
end;
компилятор немедленно известил бы нас о несовпадении заголовка с объявлением функции в интерфейсной части (второй параметр должен иметь имя у).
ИНИЦИИРУЮЩАЯ И ЗАВЕРШАЮЩАЯ ЧАСТИ
Инициирующая и завершающая части чаще всего отсутствуют
Вместе с начинающим их словами initialization и finalization.
В инициирующей части размещаются операторы, которые исполняются до передачи управления основной программе и обычно используются для подготовки ее работы. Например, в них могут инициироваться переменные, открываться нужные файлы и т. д. В завершающей части указываются операторы, выполняющиеся послезавершения работы основной программы (в них освобождаются выделенные программе ресурсы, закрываются файлы и т. д.). Если несколько модулей содержат инициирующие части, эти части выполняются последовательно друг за другом в порядке перечисления модулей в предложении uses главной программы. Если несколькомодулей содержат завершающие части, эти части выполняются последовательно друг за другом в порядке, обратном перечислению модулей в предложении uses главной программы.
Конфликт имен
Язык Delphi поддерживает два вида импортируемых идентификаторов: неквалифицированные и квалифицированные. В исходном тексте Delphi-модуля импортируемые идентификаторы обычно используются как есть (неквалифицирующий импорт), без префиксирования именем соответствующего модуля. Могут возникать ситуации, когда идентификатор с одним и тем же именем (напр., константа maxndx) описан в двух разных Delphi-модулях, причем оба импортируются данным модулем. Как быть? В этом случае применяется "правило последнего", т.е. без всякого сообщения об ошибке коллизия считается допустимой и применяется идентификатор из того модуля, который в uses-списке импорта стоит ближе к концу (т.е. отменяет совпадение предшествующего).
Если требуется явно указать конкретный идентификатор, то Delphi предоставляет возможность квалифицированных идентификаторов (напр., MyModule2.maxndx). В языке Modula-2 также поддерживаются оба вида импортируемых идентификаторов, но без права разрешения коллизии по умолчанию (это считается ошибкой, обнаруживаемой компилятором). В языке Оберон допустимы только квалифицированные идентификаторы, что снимает подобные проблемы. Более того, для удобства использования Оберон поддерживает синонимы модулей. Другими словами, в списке импорта можно вводить соответствие внешнего имени (импортируемого модуля) его внутреннему имени в данном модуле (синоним, псевдоним). Это позволяет снять зависимость по разработке модулей разными группами, которые не координированы по формированию имен.