Числовые и сравнимые значения

 

Следующий пример напрямую относится к повседневной практике ОО-разработки и неразрывно связан с построением библиотеки Kernel.

Ряд классов Kernel, потенциально необходимых всем приложениям, требуют поддержки таких операций арифметики, как infix "+" , infix "-" , infix "*" , prefix "-" , а также специальных значений zero (единичный элемент группы с операцией "+ ") и one (единичный элемент группы с операцией "* "). Эти компоненты используют отдельные классы библиотеки Kernel: INTEGER , REAL и DOUBLE . Впрочем, они нужны и другим, заранее не определенным классам, например, классу MATRIX , который описывает матрицы определенного вида. Приведенные абстракции уместно объединить в отложенном классе NUMERIC , являющемся частью библиотеки Kernel:

 

deferred class NUMERIC feature

... infix "+", infix "-", infix "*", prefix "-", zero, one...

end

 

 

NUMERIC имеет строгое математическое определение. Его экземпляры служат для представления элементов кольца (множества с двумя операциями, каждая из которых индуцирует на нем группу, причем одна из операций коммутативна, а вторая дистрибутивна относительно первой).

Многим классам необходимо отношение порядка с операциями сравнения элементов. Такая возможность полезна для классов Kernel, таких как STRING, и для многих других классов. Поэтому в состав библиотеки входит отложенный класс COMPARABLE:

 

deferred class COMPARABLE feature

... infix "<", infix "<=", infix ">", infix ">="...

end

 

 

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

Не все потомки COMPARABLE должны быть потомками NUMERIC . В классе STRING арифметика не нужна, однако нужен порядок. Обратно, не все потомки NUMERIC должны быть потомками COMPARABLE . Так, на множестве матриц с действительными коэффициентами есть сложение, умножение, единица, нуль, что придает ей свойства кольца, но нет отношения порядка. Поэтому COMPARABLE и NUMERIC должны оставаться различными классами, и ни один из них не должен быть потомком другого.

Объекты некоторых типов, однако, имеют числовую природу и одновременно допускают сравнение. (Такие классы моделируют вполне упорядоченные кольца.) Примеры таких классов - REAL и INTEGER . Целые и действительные числа сравнивают, складывают и умножают. Их описание можно построить на множественном наследовании:

 

expanded class REAL inherit

NUMERIC

COMPARABLE

feature

...

end

 

 

Рис. 15.4. Структура множественного и единичного наследования