Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Хьюз Камерон. Параллельное и распределенное программирование на С++ - royallib.ru.doc
Скачиваний:
117
Добавлен:
11.03.2016
Размер:
1.97 Mб
Скачать

Интерфейсные классы

Интерфейсный класс используется для модификации интерфейса другого класса или множества классов. Такая модификация упрощает использование класса, делает его более функциональным, безопасным или семантически корректным. Примерами интерфейсных классов могут служить адаптеры контейнеров, которые являются частью стандартной библиотеки шаблонов (Standard Template Librаrу — STL). Адаптеры обеспечивают новый открытый (public) интерфейс для таких контейнеров, как deque (double-ended queue — очередь с двусторонни м доступо м), vector (вектор) и list (список). Расс м отри м при м ер. В листин г е 10.1 представлено определение класса stack, который используется в качестве интерфейсно г о для м одификации класса vector.

// Листинг 10.1. Использование класса stack в качестве

// интерфейсного класса

template < class Container > class stack {

//...

public:

typedef Container::value_type value_type;

typedef Container::size_type size_type; protected:

Container с;

public:

bool empty(void) const {return c.empty();}

size_type size(void) const {return c.size();}

value_type& top(void) {return c.back(); }

const value_type& top const {return c.back(); }

void push(const value_type& x) {c.push.back(x); }

void pop(void) {c.pop.back(); }

};

Класс stack объявляется путе м задания типа Container

stack < vector< T > > Stack;

В данном случае типом Container является класс vector, но в качестве класса реализации для интерфейсного класса stack (вместо класса vector) можно использо-ватьлюбой контейнер, который определяет следующие методы:

empty () size() back() push.back() pop.back()

Класс stack поддерживает се м антически корректный интерфейс, традиционно принятый для стеков.

Существует несколько способов отображения интерфейса. Один из них — круг, рядом с которым (чаще — под ним) записывается имя интерфейсного класса. Этот способ показан на рис. 10.5, а. Для отображения операций класса stack м ожно также использовать си м волическое обозначение класса (с м. рис. 10.5, б). Здесь над и м ене м класса отображается индикатор стереотипа << interface>>, обозначающий, что это — интерфейсный класс. Имя интерфейсного класса может начинаться с буквы «I», и тогда все операции этого класса булут заметнее отличаться от других классов.

Для отображения отношений м ежду класса м и stack и vector м ожно использовать понятие реализации. Реализация — это се м антическое отношение между классами, в котором один из них предлагает «контракт» (интерфейсный класс), а другой ero выполняет (класс реализации). В наше м при м ере класс stack определ я ет контракт, а класс vector его выполняет. Отношение реализации отображается отрезком пунктирной линии между двумя прямоугольниками классов с крупной полой стрелкой, указывающей на интерфейсный класс, т.е. на класс, который определяет контракт (рис. 10.5, в). Это изображение читается так: «Класс stack реализуется классом vector». Отношение между интерфейсным классом и его реализатором (средством реализации) также можно отобразить в виде «леденца на палочке» (рис. 10.5, г). Класс stack может быть реализован не только классом vector, но и классами list или deque .