观察者模式:为什么主题应该是抽象的?

时间:2018-04-13 21:12:08

标签: c++ design-patterns abstract-class observer-pattern

我正在学校学习C ++,在谈论观察者模式时,我的教授说主题应该是不惜一切代价的。如果没有明显的PV方法使析构函数PV。他们还说你仍然需要实现基类析构函数以避免问题。所以2跟进问题:

  1. 为什么我们需要实现基类析构函数?什么问题不会这样做?
  2. 为什么它如此重要主题基类是抽象的?我理解为什么Observer基类需要是抽象的,但为什么要主题?

2 个答案:

答案 0 :(得分:3)

如果使析构函数成为纯虚函数,您仍然需要为它提供实现。原因是调用了继承链中所有类的析构函数,因此必须提供实现。

至于对一般抽象主体的坚持,我不太清楚它为何如此重要。我不一定同意。

答案 1 :(得分:0)

我一直使用具体主题的观察者模式。我有多态观察者,但使用类型擦除而不是继承多态。

作为一般规则,抽象接口应具有虚拟或受保护的析构函数。否则通过它删除可能会意外发生并导致UB。如果你使用类型擦除破坏(如共享ptr),这个要求就会消失;这是基于删除的破坏的怪癖。

基本上你的老师教90年代的C ++,这些规则很难避免。这不是一种可怕的方法,可能是你的教授所熟悉的。替代方案需要您可能缺乏的技能和知识,如果做错了可能会很危险。

template<class...Args>
struct broadcaster {
  std::shared_ptr<void> listen( std::function<void(Args...)> );
  void operator()( Args... ) const;
};
为简单起见,删除了详细信息,这是一个使用基于值的多态侦听器的具体主题;它违反了你教授所说的必须发生的一切。

但是,我不会教这一年的学生。