Ограничение родового параметра

Ограничение родового параметра

Эти наблюдения дают решение. Мы должны оперировать исключительно терминами классов и типов.

Потребуем, чтобы любой фактический параметр, используемый классом VECTOR (в других примерах по аналогии), был типом, поставляемым с множеством операций: infix "+", zero для инициализации суммы и т.д. Владея наследованием, мы знаем, как снабдить тип нужными операциями, - нужно просто сделать его потомком класса, отложенного или эффективного, обладающего этими операциями.

Синтаксически это выглядит так:

class C [G -> CONSTRAINING_TYPE] ... Все остальное как обычно ...

где CONSTRAINING_TYPE - произвольный тип, именуемый родовым ограничением (generic constraint). Символ -> обозначает стрелку на диаграммах наследования. Результат этого объявления в том, что:

[x]. в роли фактических родовых параметров могут выступать лишь типы, совместимые с CONSTRAINING_TYPE;

[x]. в классе C над сущностью типа G допускаются только те операции, которые допускаются над сущностью CONSTRAINING_TYPE, другими словами, представляющими собой компоненты базового класса этого типа.

Какое родовое ограничение использовать для класса VECTOR? Обсуждая множественное наследование, мы ввели в рассмотрение NUMERIC - класс объектов, допускающих базисные арифметические операции: сложение и умножение с нулем и единицей (лежащая в его основе математическая структура называется кольцом). Эта модель кажется вполне уместной, хотя нам необходимо пока только сложение. Соответственно, класс будет описан так:

indexing

description: "Векторы, допускающие сложение"

class

VECTOR [G -> NUMERIC]

... Остальное - как и раньше (но теперь правильно!) ...

После чего ранее некорректная конструкция в теле цикла

Result.put(item (i) + other.item (i), i)

становится допустимой, поскольку item (i) и other.item (i) имеют тип G, а значит, к ним применимы все операции NUMERIC, включая, инфиксный "+".

Следующие родовые порождения корректны, если полагать, что все классы, представленные как фактические родовые параметры, являются потомками NUMERIC:

VECTOR [NUMERIC]

VECTOR [REAL]

VECTOR [COMPLEX]

Класс EMPLOYEE не порожден от NUMERIC, так что попытка использовать VECTOR [EMPLOYEE] приведет к ошибке времени компиляции.

Абстрактный характер NUMERIC не вызывает никаких проблем. Фактический параметр при порождении может быть как эффективным (примеры выше), так и отложенным (VECTOR [NUMERIC_COMPARABLE]), если он порожден от NUMERIC.

Аналогично описываются класс словаря и класс, поддерживающий сортировку:

class DICTIONARY [G, H -> HASHABLE] ...

class SORTABLE [G -> COMPARABLE] ...

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Объявление родового класса

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Объявление родового класса По соглашению родовой параметр обычно, использует имя G (от Generic). Это неформальное правило. Если нужны еще родовые параметры, они будут названы H, I и т.д.Согласно синтаксису, формальные родовые параметры заключаются в квадратные скобки,


Использование родового класса

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Использование родового класса Клиент может использовать родовой класс для объявления собственных сущностей, задающих стек. В этом случае в момент объявления следует задать фактический тип элементов стека - фактический родовой параметр, например:sp: STACK [POINT]Если у класса


Операции над сущностями родового типа

Из книги автора

Операции над сущностями родового типа В родовом классе C [G, H, ...] рассмотрим сущность, чей тип - один из формальных родовых параметров, например x типа G. Когда класс используется клиентом для объявления сущностей, G, разумеется, может представлять любой тип. Поэтому любая


У10.3 Использование своего формального родового параметра фактически как чужого

Из книги автора

У10.3 Использование своего формального родового параметра фактически как чужого Сконструируйте пример, в котором подпрограмма родового класса C [G] вызывает подпрограмму, объявленную в другом родовом классе D [G], имеющую формальный параметр типа


Показания к изменению параметра

Из книги автора

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


Показания к изменению параметра

Из книги автора

Показания к изменению параметра Если вам кажется, что ваш InterBase сервер-работает слишком медленно и число страниц в кеше менее 10000, то увеличение размера кеша может улучшить


Показания к изменению параметра

Из книги автора

Показания к изменению параметра Я несколько предубеждена против этого параметра, но если хотите попробовать, то


Показания к изменению параметра

Из книги автора

Показания к изменению параметра Если у вас много памяти и локальных клиентов, то увеличение размеров области обмена (communications area) может улучшить


Показания к изменению параметра

Из книги автора

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


Показания к изменению параметра

Из книги автора

Показания к изменению параметра Первым признаком для изменения этого параметра должна быть общая низкая производительность системы с большим количеством пользователей и страниц в кеше Запустите инструмент iblockpr из директории %INTERBASE%Bin для печати блокировок Если средняя


Показания к изменению параметра

Из книги автора

Показания к изменению параметра Deadlock очень редко встречаются в InterBase Обычная ошибка deadlock, ошибка обновления (Update Conflict) не является тем deadlock, который обнаруживается менеджером блокировок. Представляет интерес запрограммировать действительный случай возникновения deadlock


Показания к изменению параметра

Из книги автора

Показания к изменению параметра Чем выше это значение, тем реже фиктивные пакеты будут появляться с сети. Но, с другой стороны, "мертвые" соединения будут дольше "висеть". Рекомендуется значительно увеличить значение этого параметра, если вы точно уверены, что клиентские


Показания к изменению параметра

Из книги автора

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


Показания к изменению параметра

Из книги автора

Показания к изменению параметра Если необходимо использовать большее число каталогов или другие каталоги, отличные от стандартных, то используйте этот