Re[2]: Интерфейсы vs Делегаты.
От: ArtDenis Россия  
Дата: 05.12.05 08:14
Оценка: 2 (1)
Здравствуйте, bada, Вы писали:

B>imho, на лицо некоторое непонимание основ.


Просто человек хочет сказать, что калбэки можно реализовать при помощи функторов, а можно при помощи интерфейсов. При помощи интерфейсов это выглядит так:

При помощи интерфейсов:
class CallbackInterface
{
public:
  virtual void do_call() = 0;
};


class ComeClass // Класс, который инициирует событие
{
  CallbackInterface * cbi;
    
    void do_something()    
    {
        //
        if (cbi) cbi->do_call(); // инициируем событие
        // 
    }
    
public:    
  void set_call_back_obj(CallbackInterface * cbi)
    {
        this->cbi = cbi;
    }
};

class Eventhandler : public /* или protected (чтобы не нарушать принцип Лисков)*/ CallbackInterface
{
  void init_events()
    {
      // Указываем, что обработчиком события явсляется наш объект
        some_class.set_call_back_obj(this);
    }

private:    
    // Обработчик события
    virtual void do_call()
    {

    }
};


При помощи функторов:
class ComeClass
{
    void do_something()    
    {
        //
        event(); // инициируем событие
        // 
    }

public:
  boost::signal<void()> event;
};

class Eventhandler
{
    boost::signals::scoped_connection scp_conn;
    
  void init_events()
    {
      // Указываем, что обработчиком события является this->do_event
        scp_conn = some_class.event.connect( boost::bind(&Eventhandler::do_event, this) );
    }

private:
    // Обработчик события
    void do_event()
    {

    }
};


Причём в последнем случае при помощи boost::signals::scoped_connection, объект отпишется от события после удаления автоматически. IMHO даже по объёму кдоа и читабельности делегаты (функторы) лучше
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.