Скачиваний:
15
Добавлен:
01.05.2014
Размер:
112.89 Кб
Скачать

2.3. Типы данных, определенные пользователем

Если в языке имеются только предопределенные типы, то надеж­ность такого языка невелика вследствие малого числа и широкого ди­апазона значений предопределенных типов.

Следующим шагом в разработке хорошего механизма типизации яв­ляется введение типов данных, определенных пользователем.

2.3.1. Производные типы

Тип данных можно рассматривать как факторизацию определенных свойств, являющихся общими для некоторого класса объектов. Если множество типов данных ограничено предопределенными типами, то все объекты, которые представлены, например, вещественным типом, долж­ны принадлежать одному и тому же классу, что может не соответство­вать смыслу и использованию таких объектов в программе.

Пример

Напишем фрагмент программы на Паскале, вычисляющий суммарный возраст для группы из 10 человек.

program sum (input, output);

var temp_age, sum_age: integer;

i: integer;

begin

sum_age := 0;

for i := 1 to 10 do

begin

read (temp_age);

sum_age := sum_age + temp_age

end;

writeln (sum_age)

end.

ЯП 2-9

В этом примере все три переменные age, sum_age и i являются целыми, хотя и принадлежат к двум логически разным классам объек­тов. Если по ошибке внутри цикла написать оператор

sum_age := sum_age + I ,

то компилятор не сможет ее обнаружить, так как пере­менные sum_age и i одного типа.

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

С использованием собственных типов эта программа может быть переписана следующим образом:

program sum1 (input, output);

type age = integer;

index = integer;

var temp_age, sum_age: age;

i: index;

begin

sum_age := 0;

for i := 1 to 10 do

begin

read(temp_age);

sum_age := sum_age + temp_age

end;

writeln(age)

end.

В данном варианте программы описанные с помощью типа age класс объектов логически отличается от класса объектов типа index.

Такие новые типы называются производными типами.

При реализации производных типов необходимо решить следующие задачи:

  • какой использовать метод определения эквивалентности типов;

  • как определить, атрибуты, которые производный тип наследует от порождающего типа.

ЯП 2-10

2.3.1.1. Эквивалентность типов

Существует два метода определения эквивалентности типов:

  • структурная эквивалентность;

  • именная эквивалентность.

При использовании структурной эквивалентности два объекта принадлежат эквивалентным типам, если у них одинаковая структура.

Фактически при структурной эквивалентности производные типы являются синонимами для имени порождающего типа и компилятор дол­жен разрешать присваивания типа

temp_age := i

Для производных типов структурная эквивалентность обеспечива­ет только большую ясность программы, не увеличивая ее надежности.

При использовании именной эквивалентности два объекта принад­лежат эквивалентным типам, только если они описаны с помощью одно­го и того же типа. Поэтому при использовании именной эквивалент­ности компилятор не будет допускать операторы вида

temp_age := i

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

Преимущества именной эквивалентности:

  • она обеспечивает большую надежность компилятора;

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

Недостатки именной эквивалентности:

  • необходимость явного определения функций преобразования типа;

  • ограничение использования описаний анонимного типа.

ЯП 2-11