假设我使用 NVI idiom 具有以下层次结构:
class Base
{
public:
virtual ~Base() {}
void foo() { cout << "Base::foo" << endl; foo_impl(); }
private:
virtual void foo_impl() = 0;
};
class A : public Base
{
private:
virtual void foo_impl() { cout << "A::foo_impl" << endl; }
};
如果在层次结构中的某个点我想在非虚拟基础方法中“添加”不变量,那么最好的方法是什么?
一种方法是在 SpecialBase 级别递归 NVI 习语:
class SpecialBase : public Base
{
private:
void foo_impl() { cout << "SpecialBase::foo" << endl; bar_impl(); }
virtual void bar_impl() = 0;
};
class B : public SpecialBase
{
private:
virtual void bar_impl() { cout << "B::bar_impl" << endl; }
};
但我不太喜欢这个想法,因为我不想为我添加到我的层次结构中的每个派生基添加方法(具有不同的名称)......
另一种方法是拥有以下(不是NVI):
class Base
{
public:
virtual ~Base() {}
virtual void foo() { base_foo(); foo_impl(); }
protected:
void base_foo() { cout << "Base::foo" << endl; }
virtual void foo_impl() = 0;
};
class SpecialBase : public Base
{
public:
virtual void foo() { base_foo(); specialbase_foo(); foo_impl(); }
protected:
void specialbase_foo() { cout << "SpecialBase::foo" << endl; }
};
class B : public SpecialBase
{
private:
virtual void foo_impl() { cout << "B::foo_impl" << endl; }
};
在我看来,这不那么令人困惑,因为在任何时候,一个具体的类只需要实现虚拟方法,而派生的基类可以覆盖基(虚拟)方法,如果它也选择的话。
是否有另一种更清洁的方法来实现相同的目标?
编辑:
我正在寻找一种非常通用的设计模式,它可以让我拥有以下类型的层次结构:
Base <- A
<- B
<- SpecialBase <- C
<- D
<- VerySpecialBase <- E
<- StrangeBase <- F
每个Base
类都可以(并且将覆盖 foo),而类A-F
只需要重新实现foo_impl
.
请注意,仅添加另一个可选的自定义虚拟函数(例如bar_impl
)在这里没有帮助,因为它只允许一个额外的自定义层,我可能需要一个无限的数量。