next up previous contents
След.: Абстракция Выше: Объектно-ориентированное программирование Пред.: Инкапсуляция   Содержание


Перегрузка

Есть возможность определить несколько разных процедур, связанных с типом, отличающихся типом и/или числом аргументов, под одним родовым именем. Для этого предназначен оператор GENERIC:

GENERIC[,открытость]:: родовое имя => список имен процедур

Здесь открытость -- это атрибут PUBLIC или PRIVATE. Вызов родового имени приводит к вызову одной из процедур в зависимости от типа и числа аргументов.

Перегрузка операторов выражений и оператора присваивания возможна с помощью специальных родовых имен OPERATOR(символ), ASSIGNMENT(=) или READ(фмт), WRITE(фмт), где фмт -- либо FORMATTED, либо UNFORMATTED. Тогда соответствующие процедуры определяют оператор выражения, присваивание, или оператор форматного или неформатного ввода/вывода для типа. Если оператор унарный, все процедуры -- функции с одним параметром (обычно это сам объект, если не назначен атрибут NOPASS), а если бинарный -- то аргументов два, причем первый отвечает левому операнду, а второй -- правому. Для присваиваний процедуры -- подпрограммы с двумя аргументами. Для операторов воода/вывода процедуры -- подпрограммы с набором аргументов, описывающих ввод/вывод. В § 11.4 подробно описана перегрузка операторов с помощью родовых интерфейсных блоков. Перегрузка с помощью оператора GENERIC и связанных с типом процедур совершенно аналогична. Эти два метода равнозначны, только интерфейсные блоки перегружают оператор для одного или нескольких типов, а средство связанных процедур определяет оператор для данного типа изнутри, что соответствует идеологии инкапсуляции. При этом первый аргумент процедур -- сам объект производного типа. Удобнее перегружать операции «изнутри», так как при импорте из модуля только типа (с помощью USE...ONLY...) реализация перегруженного оператора не будет потеряна. Пример модуля, реализующего тип «рациональное число» с перегрузкой операций приведен в Стандарте [14], приложение C 1.3. Пример абстрактного типа с отложенной процедурой, описанной абстрактным интерфейсом, и типа-потомка, который эту процедуру реализует, приведен в Стандарте [14], приложение C 1.4.



Ilya A. Chernov 2012-12-19
X