Основы объектно-ориентированного проектирования


Ограниченная универсальность - часть 2


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

Эта нотация, как показано в предыдущих лекциях, позволяет задавать ограниченную универсальность в виде:

class MATRIX [G -> RING_ELEMENT] ... class SORTABLE_LIST [G -> COMPARABLE] ...

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

  • Исчезает необходимость, подобно Ada, использовать программы в качестве родовых параметров. Только типы могут быть родовыми параметрами, что приводит к нужному согласованию и просто для понимания.
  • Исчезает необходимость в специальных обертывающих классах и объектах. Если необходима матрица целых чисел, достаточно объявить MATRIX [INTEGER] и использовать свободно целые при работе с ее элементами. Если необходим список строк с возможностью их сортировки, достаточно объявить его как SORTABLE_LIST [STRING].

Напоминаю семантику: теперь родовой параметр G не представляет произвольный тип - он должен удовлетворять ограничениям, будучи потомком определенного класса. Родовое порождение, такое как MATRIX [T], будет корректным, если и только если T - такой тип. Это верно для INTEGER, но не выполняется для типа STRING. Аналогично, STRING является наследником COMPARABLE и приемлем в качестве фактического параметра для класса SORTABLE_LIST, но это не верно для класса COMPLEX (комплексных чисел), для которых не задано отношение полного порядка. Символ -> был выбран для напоминания о стрелках в диаграммах наследования.

Обеспечение ограниченной универсальности

Наряду с неограниченной универсальностью желательно обеспечить ограниченную универсальность, основанную на правилах наследования (благодаря понятию согласованности типов) и задающую ограничения на допустимые фактические родовые параметры.

<


Начало  Назад  Вперед