Язык программирования C++ от Страуструпа


.Обширный интерфейс


Когда обсуждались абстрактные типы ($$13.3) и узловые классы ($$13.4), было подчеркнуто, что все функции базового класса реализуются в самом базовом или в производном классе. Но существует и другой способ построения классов. Рассмотрим, например, списки, массивы, ассоциативные массивы, деревья и т.д. Естественно желание для всех этих типов, часто называемых контейнерами, создать обобщающий их класс, который можно использовать в качестве интерфейса с любым из перечисленных типов. Очевидно, что пользователь не должен знать детали, касающиеся конкретного контейнера. Но задача определения интерфейса для обобщенного контейнера нетривиальна. Предположим, что такой контейнер будет определен как абстрактный тип, тогда какие операции он должен предоставлять? Можно предоставить только те операции, которые есть в каждом контейнере, т.е. пересечение множеств операций, но такой интерфейс будет слишком узким. На самом деле, во многих, имеющих смысл случаях такое пересечение пусто. В качестве альтернативного решения можно предоставить объединение всех множеств операций и предусмотреть динамическую ошибку, когда в этом интерфейсе к объекту применяется "несуществующая" операция. Объединение интерфейсов классов, представляющих  множество понятий, называется обширным интерфейсом. Опишем "общий" контейнер объектов типа T:

class container {

  public:

     struct Bad_operation { // класс особых ситуаций

       const char* p;

       Bad_operation(const char* pp) : p(pp) { }

     };

     virtual void put(const T*)

       { throw Bad_operation("container::put"); }

     virtual T* get()

       { throw Bad_operation("container::get"); }

     virtual T*& operator[](int)

       { throw Bad_operation("container::[](int)"); }

     virtual T*& operator[](const char*)

       { throw Bad_operation("container::[](char*)"); }

  // ...

};

Все-таки существует мало реализаций, где удачно представлены как индексирование, так и операции типа списочных, и, возможно, не стоит совмещать их в одном классе.




- Начало -  - Назад -  - Вперед -



Книжный магазин