Читаем Объектно-ориентированный анализ и проектирование с примерами приложений на С++ полностью

BoundedQueue(); BoundedQueue(const BoundedQueue&); virtual ~BoundedQueue(); virtual Queue& operator=(const Queue&); virtual Queue& operator=(const BoundedQueue&); virtual int operator==(const Queue&) const; virtual int operator=(const BoundedQueue&) const; int operator!=(const BoundedQueue< Item, Size>&) const; virtual void clear(); virtual void append(const Item&); virtual void pop(); virtual void remove(unsigned int at); virtual unsigned int available() const; virtual unsigned int length() const; virtual int isEmpty() const; virtual const Item& front() const; virtual int location(const Item&) const;

protected:

Bounded rep; virtual void purge(); virtual void add(const Item&); virtual unsigned int cardinality() const; virtual const Item& itemAt(unsigned int) const; static void* operator new(size_t); static void operator delete(void*, size_t);

};

Основная задача данного класса - завершить протокол, определенный в базовом классе. Часто это означает немного больше, чем простая передача обязанности классу более низкого уровня Bounded, как предлагается в следующей реализации:

template

unsigned int BoundedQueue::length() const{

return rep.length();

}

Отметим, что в описание класса BoundedQueue

включены некоторые дополнительные операции, которых нет в его суперклассе. Добавлен селектор available, возвращающий количество свободных элементов в структуре (вычисляется как разность Size - length()). Эта операция не включена в описание базового класса главным образом из-за того, что для неограниченной модели вычисление свободного места не очень осмысленно. Мы также переопределили оператор присваивания и проверку равенства. Как уже отмечалось ранее, это позволяет применить более эффективные алгоритмы по сравнению с базовым классом, так как подклассы лучше знают, что и как делать. Добавленные операторы new и delete определены в защищенной части класса, чтобы лишить клиентов возможности произвольно динамически размещать экземпляры BoundedQueue (что согласуется со статической семантикой этой конкретной формы).

Класс Unbounded имеет, в существенном, тот же протокол, что и класс Bounded, однако его реализация совершенно другая.

template class Unbounded { public: ... protected:

Node* rep; Node* last; unsigned int size; Node* cache; unsigned int cacheIndex;

};

Форма Unbounded

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

template class Node { public:

Node(const Item& i, Node* previous, Node* next); Item item; Node* previous; Node* next; static void* operator new(size_t); static void operator delete(void*, size_t);

};

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

Перейти на страницу:

Похожие книги