Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A04_Types.doc
Скачиваний:
6
Добавлен:
12.11.2019
Размер:
376.32 Кб
Скачать

Контрольные вопросы

1) Сформулируйте понятие «родовой тип данных».

2) Какой родовой тип данных называется исходным?

3) В чем полезность родового типа данных?

4) Почему параметризованный тип данных принято называть родовым?

4.10. Полиморфные операции

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

Существенным свойством полиморфной функции (процедуры) является наличие только одного тела функции (процедуры), независимо от сочетаний типов параметров. Вследствие этого следует считать ошибкой встречающееся иногда отождествление полиморфных функций с функциями, имеющие одинаковые имена. Последнее свойство называется совмещением имен и обеспечивается возможностью использования одних и тех же знаков операций при условии их разной индексации. Однако, нужно заметить, что и в этом случае часто используется термин «полиморфизм». Распространенными примерами совмещения имен операций в языках программирования являются знаки операций «+», «-», «=» и т.д., каждый из которых обозначает несколько операций, принадлежащих одному и тому же или разным типам данных. Например, знак операции «+» может изображать следующие операции:

+ : целый, целый целый;

+ : целый, вещественный вещественный;

+ : вещественный, целый вещественный;

+ : вещественный, вещественный вещественный;

+ : строка, строка строка, и т.д.

Хотя все эти операции имеют общие свойства (например, коммутативность), их не всегда можно реализовать посредством одной полиморфной функции (а при нашем подходе и невозможно, потому, что первый знак операции «+» реализуется в типе данных «целое», следующие три – в типе данных «вещественное», последний – в типе данных «строка»).

В языках программирования первого поколения (Фортран, Алгол-60) возможность совмещения имен обеспечивалась только для знаков операций стандартных типов данных. В последующих языках (ПЛ/1, Алгол-68) эта возможность была распространена как на знаки операций конструируемых типов, так и на имена функций вообще.

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

квадрат : функция (T : тип (  : функция ( T ; T ) T ), а : Т ) Т начало аа конец.

При наличии описания переменных

перем х : целое; y : вещественное;

допустимы обращения к этой функции:

квадрат(целое, х), квадрат(вещественное, y).

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

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

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

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