【发布时间】:2014-03-14 05:54:21
【问题描述】:
假设我有以下使用 NVI 成语的层次结构:
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)在这里没有帮助,因为它只允许额外的自定义层,我可能需要无限数量。
【问题讨论】:
-
“因为我不想为我添加到我的层次结构中的每个派生基添加方法(具有不同的名称)” 我不确定这是不是很糟糕主意。毕竟,您想添加不变量,即派生类也需要维护这些新的不变量。
-
考虑到您的编辑,我几乎想知道装饰器模式是否会为您提供所需的自定义层。
标签: c++ design-patterns idioms template-method-pattern non-virtual-interface