![]() |
|
![]() ![]() ![]() |
|
Melevir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 10.3.2008 Репутация: нет Всего: нет |
Задача такая: есть интерфейс, через него происходит вызов функционала. Есть набор классов, в которых реализован этот функционал. Еще есть необходимость в нормальной расширяемости - написал новый класс, заинклудил его и все, готово (так мне видится в идеале).
Есть идея сделать в каждом таком классе стандартный метод типа AddMenuOption(CMainDlg*);, запихать его в конструктор главного окна и объявить как поле интерфейса, но тогда классу придется давать ссылку на интерфейс, а это не айс.. Еще есть идея упаковать все это в длл, но она довольно бессмысленна - код в моем распоряжении, модульное функционирование самого ПО не нужно. Вот такая вот беда ![]() Если предложите чего-нибудь хорошего - буду благодарен. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Смотря какие классы и что от них требуется. Из твоего поста не совсем понятно.
Но вот тебе пример, как я пишу обработку команд, может, пригодится. Во-первых, есть маленький абстрактный класс - команда, с методами Execute и Update. Во-вторых есть коллекция команд, их может быть несколько на разных уровнях - у приложения, у окон, у документа - все зависит от задачи. И есть способ получения и диспетчеризации этих команд: получение - от нажатия кнопок, пунктов меню и т.д., Диспетчеризация - порядок обработки - в каком порядке идет обращение к коллекциям команд. Все это написано один раз и не требует изменения при расширении. А расширении происходит так: каждая конкретная команда объявляется как статический объект и регистрируется в какой-то коллекции. Я это делаю с помощью макросов, но можно и без них, несущественно. Команды остаются маленькими объектами, и не имеют состояния, но они могут для выполнения обращаться к другим известным им классам и объектам. Т.е. для добавления нового функционала нужно добавить ручки в UI, написать этот функционал и зарегистрировать команду, которая его выполняет. Два последних действия могут выполняться совершенно локально (хоть в одном файле), никак не портя окружающую действительность. Что касается расширения UI, то мне проще делать это в редакторе ресурсов, но при желании можно возложить это дело и на регистрацию команды, дописав в оболочку соответствующий менеджер. -------------------- ... |
|||
|
||||
Melevir |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 10.3.2008 Репутация: нет Всего: нет |
То есть эта команда - нечто вроде промежуточного класса между интерфейсом и реализацией, так я понял?
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не совсем. Команда - это самостоятельный объект, просто он очень маленький и не имеет состояния, так что может объявляться статически. Команда унифицирует регистрацию и выполнение любых действий.
А реализация функционала может быть совершенно любой, в каждом конкретном случае; команда просто ее вызывает. -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |