【问题标题】:Observer Pattern: Why should Subject be Abstract?观察者模式:为什么主题应该是抽象的?
【发布时间】:2018-04-13 21:12:08
【问题描述】:

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

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

【问题讨论】:

  • 主题(本身)是一个抽象概念。实例化一个纯主题意味着什么?
  • 1.您可以通过编写代码进行检查。 2. 见仁见智。

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


【解决方案1】:

如果你让析构函数成为一个纯虚函数,你仍然需要为它提供实现。原因是继承链中所有类的析构函数都被调用,所以必须提供实现。

至于坚持主题是抽象的,我不太清楚为什么它如此重要。我不一定同意。

【讨论】:

    【解决方案2】:

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

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

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

    template<class...Args>
    struct broadcaster {
      std::shared_ptr<void> listen( std::function<void(Args...)> );
      void operator()( Args... ) const;
    };
    

    为了简单起见,删除了细节,这是一个使用基于值的多态侦听器的具体主题;它违反了你的教授所说的一切必须发生的事情。

    不过,我不会教一年级学生这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2011-06-24
      • 2018-03-19
      • 2023-04-11
      相关资源
      最近更新 更多