Материалы книги получены с http://www.itlibitum.ru/
Представители
В книге «Advanced C++ Programming Styles and Idioms» Джеймс Коплин (James Coplien) выдвинул
особую разновидность объекта класса, который он назвал представителем (exemplar). Представитель - это объект класса, который является экземпляром представляемого им класса. Понятно? У меня от таких высказываний голова идет кругом.
class Exemplar {}; // Символический класс
class Foo {
private:
Foo(); // И все остальные конструкторы, кроме одного
public:
Foo(Exemplar); // Конструктор представителя
Foo* make(); // Производящие функции представителя
};
extern Foo* foo; // Сам представитель
Подробности несущественны. Важно то, что один экземпляр (на который ссылается переменная foo) выполняет функции объекта класса для класса Foo. В реализациях производящих функций необходимо убедиться, что this совпадает с представителем, поскольку производящая функция не должна вызываться для всех остальных экземпляров класса.
С представителями можно делать все то же самое, что и с объектами класса. При этом необходимо учитывать следующее:
1. Для представителей не нужно создавать отдельный класс Class.
2. С представителями не приходится объявлять друзей (обычно объект класса должен быть другом того класса, который он представляет).
3. Настоящие объекты классов заметно упрощают моделирование иерархий классов.
4. Настоящие объекты классов упрощают создание гомоморфного интерфейса для описанных выше сведений о классах.
5. С объектами классов отличия между тем, что относится к объектам класса/представителям, и тем, что относится к реальным экземплярам, становятся более отчетливыми.
В общем и целом, объекты классов оказываются более гибкими при незначительно усложнении реализации по-сравнению с экземплярами.
Назад Содержание Далее
|