Ссылки на описания модуля
Как только вы включили модуль в свою программу, все констан- ты, типы данных, переменные, процедуры и функции, описанные в секции интерфейса этого модуля, становятся доступными для вашей программы. Например, допустим, имеется следующий модуль:
unit MyStuff; interface const MyValue = 915; type MyStars = (Deneb,Antares,Betelgeuse); var MyWord : string[20];
procedure SetMyWord(Star : MyStars); function TheAnswer : integer; implementation . . . end.
Как можно видеть здесь в интерфейсной части модуля, та часть модуля, которая находится в интерфейсной секции, является видимой для вашей программы (и может ею использоваться). С учетом этого можно написать следующую программу:
program TestStuff; uses MyStuff; var I : integer; AStar : MyStars; begin Writeln(myValue); AStar := Deneb; SetMyWord(AStar); Writeln(MyWord); I := TheAnswer; Writeln(I) end.
После включения в программу оператора uses MyStuff вы можете ссылаться на все идентификаторы, описанные в интерфейсной секции модуля МyStuff (МyWord, МyValue и так далее). Однако, рассмотрим следующую ситуацию:
program TestStuff; uses MyStuff; const MyValue = 22; var I : integer; AStar : MyStars;
function TheAnswer : integer; begin TheAnswer := 1 end;
begin Writeln(myValue); AStar := Deneb; SetMyWord(AStar); Writeln(MyWord); I := TheAnswer; Writeln(I) end.
В этой программе переопределяются некоторые из идентификато- ров, описанных в МyStuff. Будучи скомпилированной и выполненной, эта программа будет использовать собственные определения для МyValue и ТheAnswer, поскольку они были описаны позднее, чем оп- ределения в МyStuff.
Вероятно, вам интересно знать, каким образом в такой ситуа- ции можно ссылаться на идентификаторы в МyStuff. Для этого необ- ходимо перед каждым идентификатором помещать имя МyStuff с точкой (.). Например, рассмотрим еще одну версию этой программы:
program TestStuff; uses MyStuff; const MyValue = 22; var I : integer; AStar : MyStars;
function TheAnswer : integer; begin TheAnswer := 1 end;
begin Writeln(MyStuff.MyValue); AStar := Deneb; SetMyWord(AStar); Writeln(MyWord); I := MyStuff.TheAnswer Writeln(I) end.
Эта третья программа даст такие же ответы, что и первая, да- же в том случае, если вы переопределите MyValue и TheAnswer. В действительности вы имели полное право написать первую программу следующим образом:
program TestStuff; uses MyStuff; var I : integer; AStar : MyStuff.MyStars;
begin Writeln(MyStuff.MyValue); AStar := My.Stuff.Deneb; MyStuff.SetMyWord(AStar); Writeln(My.Stuff.MyWord); I := MyStuff.TheAnswer; Writeln(I) end.
Отметим, что имя модуля может предшествовать любому иденти- фикатору: константе, типу данных, переменной или подпрограмме.