Раздел 6.7 - Приватные и ограниченные приватные типы

Если просто описывать типы в спецификации пакета, как было показано выше, то любой, подключив эту спецификацию с помощью with, сможет делать с вашими новыми типами все что угодно. Часто это нежелательно, так как пользователи типов (называемые иногда клиентами), будут зависеть от деталей реализации. Такая зависимость клиентов усложняет внесение изменений в реализацию (например, с целью повышения производительности).

Ada предоставляет несколько механизмов скрытия особенностей реализации от пользователей. Но для начала важно понять, что ограничение возможностей пользователя предоставляет большую свободу действий, делая вас (как разработчика типа) более свободным в выборе способа его реализации. Также вы можете свободно изменять реализацию в дальнейшем. Допустим, если в спецификации пакета описан новый тип, как это было показано выше, базирующийся на типе Integer, то пользователь сможет производить с этим типом операции сложения, вычитания и т.д. Даже если необходимо, чтобы пользователь мог использовать только операцию "меньше" (например, для упорядочивания), он, не осознавая заложенных вами ограничений, сможет использовать любые другие операции, которые могут оказаться лишенными смысла при последующей ревизии системы. Лишив пользователя возможности использования типа как обычного типа Integer, можно заставить его работать с этим типом именно так, как планировалось, и, в результате, упростить внесение изменений в реализацию.

Помещая тип в описание пакета, можно сделать его приватным. Описание типа как "private" делает недоступными обычные операции над ним (например, "+" для Integer). После описания типа необходимо привести список подпрограмм, которые будут доступны остальным клиентам как операции над данным типом. Если тип описан как приватный, то необходимо доопределить его в приватном разделе спецификации пакета. Над типом, который описан как приватный, другие пакеты могут использовать только предоставленные им операции , а также операции присваивания (:=) и равенства (=).

Приведем пример. Пусть необходимо создать тип `Key', однозначно идентифицирующий некоторый ресурс, а также предоставить пользователю пакета возможность запросить ключ (key) и определить очередность запросов ключей (назовем эту операцию "<"). Ниже приведено одно из возможных решений (пример навеян разделом 7.3.1 Ada RM) :


Verbose Configure

Заметим, что тип описан как приватный в спецификации пакета. После этого следует ключевое слово `private', которое предваряет приватный раздел спецификации пакета. В этом разделе должны быть полностью доопределен тип, и описаны константы, необходимые для завершения его определения. Несмотря на то, что Key на самом деле является числовым типом, другие пакеты не могут использовать сложение, умножение и другие арифметические операции, так как он описан как приватный. Единственными операциями над этим типом будут операции, определенные в пакете (а также := и =).

Обратите внимание на функцию "<" в приведенном выше примере. В Ada можно переопределять инфиксные операции, такие как "+", "*" и "<". Это можно сделать, описав операцию как функцию, принимающую два параметра при этом используя в качестве имени знак операции, записанный в двойных кавычках. Заметим также, что можно создать константу без указания ее фактического значения, т.е. можно объявить величину как константу данного типа, не инициализируя ее. Однако, затем необходимо дать полное описание константы в приватном разделе.

Допустим, нам не нужны заданные по умолчанию операции присваивания (:=) и равенства (=). В таком случае необходимо описать тип не как приватный, а как ограниченный приватный. Ограниченный приватный тип - это приватный тип, в котором не определены даже операции присваивания и равенства. Можно считать слово "limited" приставкой к слову `private'. Ниже приведен пример объявления типа Key, как ограниченного приватного типа.

  type Key is limited private;

Упражнение:

Как описать тип, если необходимы только две операции `up' и `down'?

  1. как приватный
  2. как ограниченный приватный
  3. как неприватный

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT     Перейти к следующему разделу

OUTLINE  Вернуться к содержанию Урока 6

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s6sf.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org