这是我在 C++ 中对半观察者模式的简化实现。 它无法编译,我对此有三个问题:
- 我需要做什么才能编译它?错误是:
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'
您认为我使用的“多重继承解决方案”好吗?我不希望
IMyInterface
继承于AObservable
,因为我希望IMyInterface
的实现者能够实现IObservable
如果他们愿意的话,就靠他们自己。有点无关,但正如我们正在做的那样。我认为
virtual void raiseChanged() Final
比void 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/