Объектно-ориентированное проектирование с примерами



Семейства классов - часть 3



Как отмечалось в главе 3, в данном случае при проектировании существуют всего три возможных альтернативы, каждая из которых требует обеспечения различного уровня взаимодействия между агентами, оперирующими с общими объектами:

    последовательный;

    защищенный;

    синхронизированный.

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

      Отражает общность различных форм.

      Позволяет осуществлять более простой доступ к элементам библиотеки.

      Позволяет избежать бесконечных метафизических споров о "чистом объектно-ориентированном подходе".

      Упрощает интеграцию системы с другими библиотеками.

      Микроорганизация

      В целях обеспечения простоты работы с системой выберем один общий стиль оформления структур и механизмов библиотеки:

      template<...>


      class Name : public Superclass {
      public: // конструкторы
      // виртуальный деструктор
      // операторы
      // модификаторы
      // селекторы

      protected: // данные
      // функции

      private: // друзья

      };

      Описание абстрактного базового класса Queue начинается следующим образом:

      template<class Item> class Queue {

      Сигнатура шаблона template служит для задания аргументов параметризованного класса. Отметим, что в C++ шаблоны сознательно введены таким образом, чтобы передать достаточную гибкость (и ответственность) в руки разработчика, инстанцирующего шаблон в своем приложении.

      Далее определим обычный список конструкторов и деструкторов:

      Queue();
      Queue(const Queue<Item>&);
      virtual ~Queue();

      Отметим, что мы описали деструктор виртуальным, чтобы обеспечить полиморфное поведение при уничтожении объектов класса. Далее объявим все операторы:




      Содержание  Назад  Вперед