В Ada имеется несколько механизмов, для того, чтобы ``скрыть'' от пользователей (``клиентов'') информацию о каком-то типе. Запрет доступа к информации для клиентов, которые не должны ее использовать, называется инкапсуляцией. Инкапсуляция делает сопровождение программ более удобным и повышает их надежность.
В уроке, в котором рассматривались типы, было показано, каким образом можно описать ``приватные'' типы в Ada. Это справедливо и для тэговых типов, поэтому их тоже можно описывать как ``private'', скрывая особенности реализации от пользователей. В языке Ada имеется несколько способов управления видимостью информации.
Наиболее общий способ сокрытия особенностей реализации состоит в том, что тип в разделе описаний пакета описывается, как ``tagged private'' (если нет необходимости, чтобы пользователь знал о родительском типе) или ``new имя_родительского_типа with private'' (если необходимо, чтобы пользователь знал о родительском типе). После каждого описания типа необходимо помещать описания подпрограмм, выполняющих операции над ним. В приватной части раздела описаний пакета помещается полное описание типа.
Вот еще один пример. Создадим тип с именем `File' , содержащий имя файла, и производный тип `Ada_File' , который кроме всего прочего, хранит информацию о том, был ли скомпилирован данный файл. Каждый из типов имеет подпрограмму ``View''. Вот как это будет выглядеть:
package File_System is type File is tagged private; procedure View(F : File); type Ada_File is new File with private; procedure View(F : Ada_File); private type File is tagged record -- Строки будут рассмотрены далее Name : String(1..20); end record; type Ada_File is new File with record Compiled : Boolean := False; end record; end File_System;
Далеее необходимо создать тело пакета c подпрограммами:
package body File_System is procedure View(F : File) is begin -- ... end View; procedure View(F : Ada_File) is begin -- ... end View; end File_System;
В общем случае, пакет в Ada может содержать внутри несколько типов. Раздел описаний пакета в этом случае будет содержать набор типов, описанных как ``tagged private'', или ``new Родительский_Тип with private'', а в приватной части раздела описаний пакета они будут описаны ``как положено''. В теле пакета будут находиться подпрограммы.
Дана процедура Try_Stuff:
with File_System; procedure Try_Stuff is My_Ada_File : File_System.Ada_File; begin -- Дописать. end Try_Stuff;
Допустим, в строке, содержащей комментарий ``Дописать'' необходимо присвоить свойству ``Compiled'' объекта My_Ada_File значение ``True''. Как это сделать?
Перейти к предыдущему разделу | Перейти к следующему разделу | Вернуться к содержанию Урока 7 |
---|
David A. Wheeler (dwheeler@ida.org)
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s7s4.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк