Есть базовый класс CObject,от него наследуется singletone-класс CChild. Задача : - как сделать так,чтобы при помощи CObject можно было просигнализировать клиентам CChild о наступлении какого-либо события? Т.е. имеется объект класса CObject,он отслеживает некоторые события,о которых должны знать клиенты CChild. Подскажите способ реализации...при помощи static членов CObject или callback-ов?
Клиенты подписываются на события CChild. CChild предоставляет интерфейс для подписки и отписки клиентов, клиенты предоставляют сигнальный интерфейс CChild-у.
Booster,а CObject куда подевался?Ведь это он должен оповещать о событии... Если использовать паттерн Observer,то меня смущает такой момент : ведь CChild наследуется как singletone от CObject,поэтому CObject ничего не может знать о классе CChild и хранение ссылок на CChild в CObject - нарушение наследования?Или я что-то не понимаю?
AlexCasual А при чем тут синглтонность CChild? К делу она никак не относится. CChild передает CObject-у функтор, который надо дернуть по наступлению события. А что в этот функтор будет завернуто - простой вызов, отправка сообщения, или что-то еще - это уже дело вкуса.
AlexCasual У CChild есть клиенты, а CObject должен их оповещать? Почему не сделать всё это в одном из этих классов, зачем разделять обязанности? Мне не совсем понятна причина подписки клиентов у одного класса, на события другого. Ссылка на CChild в CObject плоха тем, что это увеличивает зависимости по типам. Если необходимо чтобы именно CObject оповещал о событиях, а CChild хранил клиентов, то можно реализовать полный(одинаковый) интерфейс подписки в обоих этих классах. И пусть CChild подписывается на события у CObject, CObject оповещает CChild -а, а CChild перенаправляет оповещения. И уже не важно наследник CChild от CObject или нет. Вообще нужно стремиться всегда уменьшать зависимости между типами, стараться не разделять ответственность между классами/модулями и стараться не запутывать логику. Вообще один из минусов С++ в том, что там нет поддержки интерфейсов самим языком. Абстрактный класс в какой-то степени позволяет их эмулировать, но это не совсем то.