Інтерфейсні класи - паралельне і розподілене програмування на з

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

// Лістинг 10.1. Використання класу stack як

template class stack

typedef Container :: value_type value_type;

typedef Container :: size_type size_type; protected:

size_type size (void) const

const value_type top const

void push (const value_type x)

Клас stack оголошується шляхо м завдання типу Container

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

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

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

Існує кілька способів відображення інтерфейсу. Один з них - коло, поруч з яким (частіше - під ним) записується ім'я интерфейсного класу. Цей спосіб показаний на рис. 10.5, а. Для відображення операцій класу stackм ожно також використовувати сі м воліческое позначення класу (з м. Рис. 10.5, б). Тут над і м ене м класу відображається індикатор стереотипу>, що позначає, що це - інтерфейсний клас. Ім'я интерфейсного класу може починатися з літери «I», і тоді всі операції цього класу Булут помітніше відрізнятися від інших класів.

Для відображення відносин м ежду класу м і stack і vectorм ожно використовувати поняття реалізації. Реалізація - це се м антична відношення між класами, в якому один з них пропонує «контракт» (інтерфейсний клас), а інший ero виконує (клас реалізації). У наш м при м ере клас stack определ я ет контракт, а клас vector його виконує. Ставлення реалізації відображається відрізком пунктирною лінії між двома прямокутниками класів з великої порожнистої стрілкою, що вказує на інтерфейсний клас, тобто на клас, який визначає контракт (рис. 10.5, в). Це зображення читається так: «Клас stack реалізується класом vector». Відношення між інтерфейсним класом і його реалізатором (засобом реалізації) також можна відобразити у вигляді «льодяника на паличці» (рис. 10.5, г). Клас stack може бути реалізований не тільки класом vector, а й класами list або deque.

Мал. 10.5. Способи подання интерфейсного класу