Вопрос по Singletone

Тема в разделе "LANGS.C", создана пользователем AlexCasual, 11 ноя 2011.

  1. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Есть базовый класс CObject,от него наследуется singletone-класс CChild.
    Задача :
    - как сделать так,чтобы при помощи CObject можно было просигнализировать клиентам CChild о наступлении какого-либо события?

    Т.е. имеется объект класса CObject,он отслеживает некоторые события,о которых должны знать клиенты CChild.

    Подскажите способ реализации...при помощи static членов CObject или callback-ов?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Клиенты подписываются на события CChild. CChild предоставляет интерфейс для подписки и отписки клиентов, клиенты предоставляют сигнальный интерфейс CChild-у.
     
  3. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Booster,а CObject куда подевался?Ведь это он должен оповещать о событии...
    Если использовать паттерн Observer,то меня смущает такой момент : ведь CChild наследуется как singletone от CObject,поэтому CObject ничего не может знать о классе CChild и хранение ссылок на CChild в CObject - нарушение наследования?Или я что-то не понимаю?
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Это каша. Зачем? Хотя это и не нарушение, но для чего так сложно?
     
  5. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Booster,ну а как иначе?...Ведь необходимо CChild оповестить именно через CObject...
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    AlexCasual

    А при чем тут синглтонность CChild? К делу она никак не относится. CChild передает CObject-у функтор, который надо дернуть по наступлению события. А что в этот функтор будет завернуто - простой вызов, отправка сообщения, или что-то еще - это уже дело вкуса.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    AlexCasual
    У CChild есть клиенты, а CObject должен их оповещать? Почему не сделать всё это в одном из этих классов, зачем разделять обязанности? Мне не совсем понятна причина подписки клиентов у одного класса, на события другого. Ссылка на CChild в CObject плоха тем, что это увеличивает зависимости по типам. Если необходимо чтобы именно CObject оповещал о событиях, а CChild хранил клиентов, то можно реализовать полный(одинаковый) интерфейс подписки в обоих этих классах. И пусть CChild подписывается на события у CObject, CObject оповещает CChild -а, а CChild перенаправляет оповещения. И уже не важно наследник CChild от CObject или нет. Вообще нужно стремиться всегда уменьшать зависимости между типами, стараться не разделять ответственность между классами/модулями и стараться не запутывать логику. Вообще один из минусов С++ в том, что там нет поддержки интерфейсов самим языком. Абстрактный класс в какой-то степени позволяет их эмулировать, но это не совсем то.