Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
uch_pos.docx
Скачиваний:
213
Добавлен:
20.03.2016
Размер:
423.96 Кб
Скачать

4.1.7. Типы в odl

Средства ODL предоставляют проектировщику систему типов, подобную системам типов языка С или других популярных языков программирования. Система типов строится из базовых типов, которые определены сами по себе, с помощью конкретных рекурсивных правил (сложные типы строятся из более простых). Базовые типы ODL:

  1. Атомарные типы: целое число с плавающей точкой, символ, строка символов, булево выражение и перечисление. Последний тип – это список имен, объявленных синонимами целых чисел. Перечисление содержится в строке 5 примера 4.4, где имена ткань, мех, кожа в результате были определены как синонимы чисел 0, 1, 3.

  2. Типы интерфейса, например Изделие и Мастер, являются реальными структурами с компонентами для каждого атрибута и каждой связи данного интерфейса. Эти имена представляют сложные типы, определяемые с помощью перечисленных ниже типов, но их можно считать базовыми.

Базовые типы комбинируются в структурные типы с помощью следующих конструкторов типов:

  1. Множество. Если T -любой тип, то Set<T> обозначает тип, значениями которого являются все конечные множества элементов типа Т.

  2. Мультимножество. Если Т – любой тип, то Bag<T > обозначает тип, значениями которого являются все мультимножества элементов типа Т. Мультимножество допускает многократное повторение одного и того же элемента. Например, {1, 2, 1} – это мультимножество, а не множество, так как 1 повторяется в нем дважды.

  3. Список. Если Т– любой тип, то List<T> обозначает тип, значениями которого являются конечные списки, состоящие из нуля или более элементов типа Т. В специальном случае тип string является сокращением типа List<char>.

  4. Массив. Если Т– любой тип, то Аггау<Т> обозначает тип, элементами которого является массив из i элементов типа Т. Например, Array<char,10> обозначает символьную строку длиной 10.

  5. Структуры. Если Т1,T2, ..., Тn являются типами, a F1, F2, ..., Fn именами полей, то

Struct N {Т1F1,T2F2…,TnFn}

обозначает тип с именем N, элементами которого служат структуры, содержащие п полей; i-е поле имеет имя Fi и тип Тi. Например, строка 10 в примере 4.4 показывает тип структуры с именем Адрес с пятью полями.

Для того чтобы различать множества, мультимножества и списки следует помнить, что элементы множества не упорядочены и каждый из них входит в данное множество только один раз. Мультимножество допускает более одного вхождения любого элемента, но элементы и их вхождения не упорядочены. В списке может быть несколько вхождений одного и того же элемента, но все вхождения в нем упорядочены. Значит, {1, 3, 1} и {3, 1, 1} – это одно и то же мультимножество, но {1, 3, 1} и {3, 1, 1} – это разные списки.

Первые четыре типа – множество, мультимножество, список и массив – называются типами множеств. Существуют правила, определяющие, какие типы можно ассоциировать с атрибутами, а какие со связями.

Построение типа атрибута начинается с атомарного типа или со структуры, полями которой являются атомарные типы. Затем по выбору можно применить тип множества к исходному атомарному типу структуры.

Тип связи – это или тип интерфейса, или тип набора, примененный к типу интерфейса.

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

Пример 4.6. Возможные типы атрибутов:

  1. integer.

  2. Struct N {string fieldl, integer field2}.

  3. List<real>.

  4. Array<Struct N {string fieldl, integer field2}>.

Здесь 1 – атомарный тип, 2 – структура атомарных типов, 3 – множество атомарного типа, а 4 – множество структур, построенных из атомарных типов.

Допустим, что доступными базовыми типами являются имена интерфейсов Изделие и Мастер. Тогда можно построить типы связи Изделие или Bag<Мастер>. Однако следующие типы связей недопустимы:

  1. Struct N {Изделие fieldl, Мастер field2}. Типы связей не могут включать в себя структуры.

  2. Set<integer>. Типы связей не могут содержать атомарные типы.

  3. Set<Array<Мастер>. Типы связей не могут содержать два применения типов множества (их не могут содержать и типы атрибутов).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]