c++ - C++ 中的多重继承观察者模式实现

标签 c++ multiple-inheritance final observers

这是我在 C++ 中对半观察者模式的简化实现。 它无法编译,我对此有三个问题:

  1. 我需要做什么才能编译它?错误是:

error C2259: 'MyClass' : cannot instantiate abstract class 1>
due to following members: 1> 'void IObservable::addObserver(void *)' : is abstract 1>
e:_projects\test\test.cpp(9) : see declaration of 'IObservable::addObserver' 1> 'void IObservable::removeObserver(void *)' : is abstract 1>
e:_projects\test\test.cpp(11) : see declaration of 'IObservable::removeObserver'

  1. 您认为我使用的“多重继承解决方案”好吗?我不希望 IMyInterface 继承于 AObservable,因为我希望 IMyInterface 的实现者能够实现 IObservable如果他们愿意的话,就靠他们自己。

  2. 有点无关,但正如我们正在做的那样。我认为 virtual void raiseChanged() Finalvoid raiseChanged() 更明确,以便告诉实现者我不希望它被覆盖。除了一点性能影响之外,这样做还有什么缺点吗?

代码:

class IObservable
{
public:

  virtual void addObserver(void *observer) = 0;

  virtual void removeObserver(void *observer) = 0;
};


class AObservable : public IObservable
{
public:
  AObservable()
    : _observerCount(0)
  {
  }

  virtual void addObserver(void *observer) final override
  {
    ++_observerCount;
  };

  virtual void removeObserver(void *observer) final override
  {
    --_observerCount;
  };

protected:
  virtual void raiseChanged() final
  {
    // call all the observers
  }

private:
  // We just count instead of the data structure
  int _observerCount;
};


class IMyInterface : public virtual IObservable
{
public:
  virtual void someMethod() = 0;
};

class AMyClass : public IMyInterface,
                 public virtual AObservable
{
public:
  virtual void someMethod() = 0;
};

class MyClass : public AMyClass
{
public:
  virtual void someMethod() final override
  {
    //does something
    raiseChanged();
  }
};


int main(int argc, char* argv[])
{
  MyClass cla;
  cla.someMethod();
    return 0;
}

最佳答案

复杂的继承问题通常可以通过使用组合而不是继承来解决。在您的情况下,您可以将 AObservable 视为实现而不是父类(super class):

class AMyClass : public IMyInterface
{
  struct : AObservable {
    // Make the protected raiseChanged method public so we can use it.
    using AObservable::raiseChanged; 
  } impl;

public:
  virtual void someMethod() = 0;

  virtual void addObserver(void *observer) override
  {
    impl.addObserver(observer);
  }

  virtual void removeObserver(void *observer) override
  {
    impl.removeObserver(observer);
  }

protected:
  void raiseChanged() { impl.raiseChanged(); }
};

关于c++ - C++ 中的多重继承观察者模式实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24712120/

相关文章:

java - 关于Java中声明为final的变量的一些澄清?

java - 更改类变量并保存更改以供将来的程序运行?

c++ - 死亡钻石和作用域解析运算符 (c++)

python从具有相同方法名称的不同路径的多重继承

派生类中的 C++ 纯虚函数实现

c++ - 堆——构造函数和析构函数,内存分配

java - 为什么内部类接受静态最终变量?

c++ - 带链接字符串的 Ncurses 菜单

c++ - Qt/MFC 迁移框架工具 : properly exiting DLL?

c++ - is_integral vs is_integer : is one of them redundant?