观察者模式:为什么主题应该是抽象的?
Observer Pattern: Why should Subject be Abstract?
我在学校学习C++,当谈到观察者模式时,我的教授说主题应该不惜一切代价抽象。如果没有明显的PV方法,则使析构函数PV。他们还说,你仍然需要实现基类析构函数以避免出现问题。所以2个后续问题:
- 为什么我们需要实现基类析构函数?这样做不会导致什么问题?
- 为什么主题基类是抽象的如此重要?我理解为什么观察者基类需要抽象,但为什么是主题?
如果你使析构函数成为纯虚函数,你仍然需要为它提供实现。原因是调用继承链中所有类的析构函数,因此必须提供实现。
至于坚持主题一般是抽象的,我不太确定为什么它如此重要。我不一定同意这一点。
我一直在具体主题中使用观察者模式。 我有多态观察器,但使用类型擦除而不是继承进行多态。
作为一般规则,抽象接口应具有虚拟或受保护的析构函数。 否则,通过它删除可能会意外发生并导致 UB。 如果您使用类型擦除销毁(如共享 ptr),则此要求将消失;这是基于删除的破坏的怪癖。
基本上,你的老师正在教90年代的C++,这些规则很难避免。 这不是一个可怕的方法,可能是你的教授所熟悉的。 替代方案需要您可能缺乏的技能和知识,如果做错了,可能会很危险。
template<class...Args>
struct broadcaster {
std::shared_ptr<void> listen( std::function<void(Args...)> );
void operator()( Args... ) const;
};
为了简单起见,删除了细节,这是一个使用基于值的多态听众的具体主题;它违反了你的教授所说的必须发生的一切。
但是,我不会教一年级学生这个。
相关文章:
- 抽象类错误,请参阅声明" "是抽象的
- C++抽象的字节序是中立的吗?
- 虽然我添加了boost库,但Eclipse并不是用C++构建的.为什么
- 观察者模式:为什么主题应该是抽象的?
- 派生类仍然是抽象的
- 确保课程不是抽象的
- 为什么我的课被认为是抽象的
- 基类为抽象的 ADT 数组
- 继承抽象的基础接口及其实现给出了C2259
- Qt5 有没有办法让QLocalServer监听抽象的Unix套接字
- 在OCAML中,抽象的价格有多大(即多态性功能)
- 这个派生类是如何抽象的
- 为什么复制初始化是这样的?为什么需要复制构造函数
- 为什么 C++11 允许抽象的最终类
- 具有多个非可选参数的转换构造函数是什么样子的?为什么它有意义
- 为什么这个课是抽象的
- 为什么编译器认为这个类是抽象的(C++)
- 为什么这个没有声明任何纯虚成员函数的类是抽象的?
- 使用纯虚拟方法的抽象类 - 为什么可以做"Abstract * abs3;"?
- 为什么C++"虚拟"和"=0"都需要来描述一个抽象的方法?