|
Проверка граней Давайте еще немного расширим эту идиому и предположим, что некоторая грань может поддерживаться или не поддерживаться объектом. О том, почему и как это может произойти, мы поговорим во время изучения переходных типов далее в этой главе, а пока ответим на вопрос: как клиент может определить, поддерживается ли некоторый объект некоторой гранью? Решение построено на другом С++-изме - перегрузке оператора !. class ViewEvents { private: View* view; public: ViewEvents(View* v) : view(v) {} bool operator!() { return view == NULL; } // И т.д. }; // В клиентском коде ViewEvents ve(aViewGemstone); if (!ve) { cerr << "Вид не обрабатывает событий!" << endl; throw interface_error; } Предполагается, что aViewGemstone относится к кристаллам вида, о которых говорилось выше, и содержит операторную функцию operator ViewEvents(). Ключевая строка ViewEvents ve(aViewGenistone) работает в два этапа: сначала вызывается операторная функция operator ViewEvents(), выполняющая преобразование, а затем ve конструируется с помощью конструктора копий ViewEvents. Если кристалл вида решает, что данный вид не обрабатывает событий, он может сконструировать экземпляр ViewEvents с view, равным NULL. Затем оператор ! проверяет возвращенную грань. Функции грани также могут проверять наличие объекта перед тем, как пытаться что-то делегировать ему. Void ViewEvents::DoSomething() { if (!*this) // то есть if (view == NULL) // Инициировать исключение view->DoSomething(); } |
Copyright 2005. Климов Александр. All Right Reserved.