Раздел 6.3 - Создание типов и подтипов

Характеристиками типа в Ada являются набор значений и элементарных операций. Например, тип Integer можно задать набором значений (..., -2, -1, 0, 1, 2, ...) и набором элементарных опреаций (+, -, *, / и т.д.). В дальнейшем мы более подробно остановимся на "элементарных операциях".

Объект заданного типа является абстракцией, которая во время работы программы хранит (имеет) значение данного типа. Например, переменная `Number_Of_Widgets' является объектом; Number_Of_Widgets может быть переменной типа Integer.

Ada позволяет создавать произвольные типы, предоставляя широкие возможности для создания типов с набором именно тех операций, которые необходимы.

Для создания нового типа необходимо использовать описание типа. Описание типа начинается с ключевого слова type, за которым следует имя нового типа, ключевое слово is и затем определение самого типа. Ниже приведен пример нового типа Column, который может содержать целые значения в диапазоне от 1 до 72, и другого типа Row, содержащего значения от 1 до 24:

 type Column is range 1 .. 72;
 type Row    is range 1 .. 24;

В Ada разрешено описывать типы там же, где и переменные, но в реальных программах на Ada описания типов обычно находятся в начале спецификации пакета, и за ними следуют описания подпрограмм, использующих данный тип. Иногда типы описывают в начале тела пакета, если данный тип используется только внутри реализации пакета.

Имеется одно очень важное отличие между Ada и другими языками: в Ada предполагается, что типы различны, даже если они были описаны одинаково. Например, невозможно сложение объекта типа Column с объектом типа Row или Integer без некоторых дополнительных выражений, даже если они описаны одинаково в данной системе. Почему? Да потому, что они имеют разные типы. Можно создать операции, которые позволят смешивать эти типы, но автоматически они не появятся.

Такой запрет на смешение типов часто полезен при поиске ошибок, но иногда это не совсем то, чего мы хотим. Начинающие программисты на Ada иногда создают очень много различных числовых типов, усложняя простые программы. Если два различных типа тесно связаны и возможно их смешение, наверное, лучше иметь два связанных типа вместо двух независимых. Вероятно, в данном случае необходимо описание подтипа.

Подтип является просто другим именем существующего типа и может накладывать на него некоторые дополнительные ограничения. Например, пусть имеется программа, манипулирующая счетчиками множества различных типов объектов. Тогда, вероятно, необходимо создание базового типа `Count' и подтипов для реализации счетчиков этих объектов. Если объектов должно быть меньше , чем 100000, а Widget не может быть больше чем 100 (в то время, как нет ограничений для Egg), то необходимо определить эти подтипы следующим образом:

 type Count is range 0 .. 99_999;
 subtype Widget_Count is Count range 0 .. 99;
 subtype Egg_Count is Count;

Подтипы могут быть описаны там же, где и типы.

Одним из случаев, когда особенно рекомендуется использование подтипов вместо множества новых числовых типов, является программное обеспечение для управления системами реального времени или научное программное обеспечение, которое содержит большое количество разнообразных единиц измерения, используемых одновременно. В Ada возможно описание новых типов "Meters", "Meters_Squared" и "Meters_Per_Second" (метры, квадратные метры и метры в секунду, соответственно) и т.д. Чтобы реализовать такую схему, вообще говоря, необходимо создать несколько операций, таких, которые, перемножая две переменные типа "Meters", вычисляли бы"Meters_Squared" и т.п. В реальном программном обеспечении такого типа, попытка создания всех возможных комбинаций нерациональна, так как обычно в программе имеется большое число различных единиц и множество их комбинаций.

Однако, не надо думать, что создание новых числовых типов - это всегда плохо. Встречаются случаи, когда вполне допустимо использование новых типов числовых значений. В Ada для этого имеются все возможности; необходимо лишь решить, какие из них применимы к вашей задаче.


Упражнение:

Если необходимо разрешить свободное смешение двух различных типов чисел, то как они должны быть описаны?

  1. как подтипы
  2. как типы

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

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

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

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

David A. Wheeler (dwheeler@ida.org)

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

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

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