给定以下内容:
class Observer
{
public:
virtual void Observe(Parameter p) = 0;
};
template<size_t Tag>
class TaggedObserver : public Observer { };
class Thing : public TaggedObserver<0>, TaggedObserver<1>
{
public:
virtual void Observe(Parameter p) override;
};
Thing::Observe
覆盖TaggedObserver<0>::Observe
和TaggedObserver<1>::Observe
。有没有办法为每个基类提供不同的替代?
原理:我希望该类能够观察两个相同类型的通知源,并且每个源具有不同的操作,而不必诉诸于在参数中传递源,然后在
if
/switch
中对其进行检查。 最佳答案
为了提供不同的替代,您需要定义不同的派生类,例如:
class Observer
{
public:
virtual void Observe(Parameter p) = 0;
};
template<size_t Tag>
class TaggedObserver : public Observer
{
};
class TaggedObserverZero : public TaggedObserver<0>
{
public:
virtual void Observe(Parameter p)
{
// do something ...
}
};
class TaggedObserverOne : public TaggedObserver<1>
{
public:
virtual void Observe(Parameter p)
{
// do something else ...
}
};
但是,如果希望
Thing::Observe()
首先接收Parameter
并将其分派(dispatch)到适当的基类,则无法避免在if
中使用Thing
语句(或等效语句),因为它继承了TaggedObserver::Observe()
的多个拷贝,并且需要确定要复制哪个称呼:class Thing : public Observer, TaggedObserverZero, TaggedObserverOne
{
public:
virtual void Observe(Parameter p)
{
if (some condition)
TaggedObserverZero::Observe(p);
else if (some other condition)
TaggedObserverOne::Observe(p);
}
};
或者,您无条件地仅将它们都调用,然后让他们找出要做什么:
class TaggedObserverZero : public TaggedObserver<0>
{
public:
virtual void Observe(Parameter p)
{
if (some condition)
// do something ...
}
};
class TaggedObserverOne : public TaggedObserver<1>
{
public:
virtual void Observe(Parameter p)
{
if (some other condition)
// do something else ...
}
};
class Thing : public Observer, TaggedObserverZero, TaggedObserverOne
{
public:
virtual void Observe(Parameter p)
{
TaggedObserverZero::Observe(p);
TaggedObserverOne::Observe(p);
}
};