Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Передача событий по иерархии наследования (число прочтений - 3530 )
mash
1c++ donor
Отсутствует


1C++ v. 3.0.1.23

Сообщений: 148
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Передача событий по иерархии наследования
23. Октября 2008 :: 08:24
Печать  
Возникла тут у меня одна идея  Смущённый Но вот как реализовать ни очень знаю.

Хотелось бы реализовать схему, при которой методы базовых классов генерируют событий, обработчики которых прописаны (или не прописаны) в классах наследниках.
Например, есть у меня класс "Отчеты", который наследует десятку разноплановых классов - реализаций алгоритмов отчетов,  который реализует методы УстановитьЗначениеОтбора() и ПолучитьЗначениеОтбора(). Мне бы хотелось чтобы в методе УстановитьЗначениеОтбора() всем наследникам рассылалось событие "ПриУстановкеЗначенияОтбора" которое они могли бы отрабатывать (или не отрабатывать) по своему желанию.

Реализация с МенеджеромСобытий - идеальна, однако невозможна вследствии циклических ссылок (если менеджера хранить внутри самого объекта).

Реализация переопределяемого метода-обработчика ПриУстановкеЗначенияОтбора(), конечно выход, но немного корявый, в случае когда наследников больше одного.

Может быть, кто то уже сталкивался  такими решениями и подскажет выход ?
  

Поспешность наносит ущерб
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача событий по иерархии наследования
Ответ #1 - 23. Октября 2008 :: 09:11
Печать  
Что значит "всем наследникам рассылалось событие"?
Сообщения принимают не классы, а объекты классов.

Если у тебя в классе прописана подписка на прием сообщения - любой объект этого класса подпишется на нужное тебе сообщение и получит его.

И наследование тут совершенно ни при чем.
  
Наверх
www  
IP записан
 
mash
1c++ donor
Отсутствует


1C++ v. 3.0.1.23

Сообщений: 148
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача событий по иерархии наследования
Ответ #2 - 23. Октября 2008 :: 09:53
Печать  
возможно не так выразился. Суть задачи, в том чтобы издателем и подписчиком событий являлись методы одного и того же объекта.
  

Поспешность наносит ущерб
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача событий по иерархии наследования
Ответ #3 - 23. Октября 2008 :: 11:03
Печать  
В общем, автор не хочет пользоваться виртуальными методами Улыбка
Хочется ему что-то другое.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
mash
1c++ donor
Отсутствует


1C++ v. 3.0.1.23

Сообщений: 148
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача событий по иерархии наследования
Ответ #4 - 23. Октября 2008 :: 11:04
Печать  
Поясню задачу. Есть базовый класс - Отчеты. У него есть метод УстановитьЗначениеОтбора. Есть его наследник Отчеты.РасчетныеСчета. В котором я хочу определить, что при смене отбора - необходимо очистить кэш значений.  У Отчеты.РасчетныеСчета - тоже есть наследник ("внук" класса Отчеты) Отчеты.РасчетныеСчета.Остатки, он дополняет исходный класс функциональностью - при установке значения отбора сгенерировать новый текст запроса (ну к примеру).

Самый простой вариант определить в базовом классе метод ПриУстановкеОтбора(), который переопределить в классах-наследниках. Проблема этого метода - то что в объекте класса Отчеты.РасчетныеСчета.Остатки будет реализован только метод самого последнего наследника ("внука"), а поведение добавляемое Отчеты.РасчетныеСчета не будет реализовано (так как на него просто напросто не будет передано управление).  Чтобы построить цепочку необходимо в каждом переопределенном методе юзать вирт().ПолучитьБазовыйКласс().ПриУстановкеОтбора()

Элегантный вариант - метод УстановитьЗначениеОтбора послыает событие "ПриИзмененииОтбора", а в конструкторе каждого наследника, мы дополняем (а не переопределяем) список методов класса которые это событие будут обрабатывать. Таким образом - базовый класс - ничего не знает о своих наследниках, и просто посылает событие внутри объекта. А обработчики этого события назначаются уже в конструкторах наследников.
  

buf.jpg ( 8 KB | Загрузки )
buf.jpg

Поспешность наносит ущерб
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Передача событий по иерархии наследования
Ответ #5 - 23. Октября 2008 :: 12:51
Печать  
mash писал(а) 23. Октября 2008 :: 11:04:
Самый простой вариант определить в базовом классе метод ПриУстановкеОтбора()...


Не поверишь, но это, действительно, самый простой способ! Смех
  
Наверх
ICQ  
IP записан
 
mash
1c++ donor
Отсутствует


1C++ v. 3.0.1.23

Сообщений: 148
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Передача событий по иерархии наследования
Ответ #6 - 23. Октября 2008 :: 12:58
Печать  
А как быть если иерархия класса более чем два уровня ? Отработает ПриУстановкеОтбора только последнего наследника. Или юзать вирт().ПолучитьБазовыйКласс(<ИмяПредка>).ПриУстановкеОтбора() ?
  

Поспешность наносит ущерб
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Передача событий по иерархии наследования
Ответ #7 - 23. Октября 2008 :: 13:10
Печать  
Если в каждом наследнике будет вызов метода базового класса, получится именно то, что ты хочешь.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать