Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция2 ЯП КБ.doc
Скачиваний:
8
Добавлен:
22.08.2019
Размер:
89 Кб
Скачать
☆

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

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

Если множество типов данных ограничено предопределенными типами, то все объекты, которые представлены каким-то типом, должны принадлежать одному и тому же классу, что может не соответствовать смыслу и использованию таких объектов в программе.

Пример:

program sum (input, output);

Var temp_weight, sum_weight: integer;

I: integer;

begin

sum_weight:=0;

for i:=1 to 10 do

begin

read (temp_weight);

sum_weight:=sum_weight+temp_weight

end;

writeln (sum_weight)

end.

Логически неправильная запись:

sum_weight:=sum_weight+i;

Решение проблемы: определение в программе собственных (производных) типов на основе базовых (порождающих) типов.

Определим новые типы weight и index на основе базового типа integer.

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

Пример:

program sum1 (input, output);

type

weight=integer; {вес}

index=integer; {индекс}

Var temp_weight, sum_weight: weight;

I: index;

begin

sum_weight:=0;

for i:=1 to 10 do

begin

read (temp_weight);

sum_weight:=sum_weight+temp_weight

end;

writeln (sum_weight)

end.

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

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

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

  • с использованием именной эквивалентности.

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

Здесь производные типы являются синонимами для имени порождающего типа.

Присваивание sum_weight:=i разрешено.

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

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

Присваивание sum_weight:=i рассматривается как ошибка.

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

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

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

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

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

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

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

4.6. Наследование атрибутов

Множество атрибутов типа включает в себя:

  • Множество значений;

  • Литеральные обозначения констант;

  • Множество определенных для типа операций.

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

Пример:

program square_figure (input, output);

type

length=real; {длина}

square=real; {площадь}

var

a, b: length;

s: square;

begin

read (a, b);

s:=a*b;

writeln (s)

end.

Оператор присваивания s:=a*b не допустим!

Оператор a:=a*b синтаксически корректен, но является бессмысленным с точки зрения размерности.

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

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

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

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