私有方法模式的私有覆盖? (答案:NVI)

时间:2010-07-22 13:58:50

标签: design-patterns virtual private template-method-pattern non-virtual-interface

用于描述仅虚拟调用的方法以及基础中的其他方法的行话(如果有的话)是什么?我偶尔会看到这被称为回调,但这似乎偏离了该术语的原始定义。我甚至不确定这是一种被称为模式的优点,但我正试图在评论我的代码时变得更加精确。谢谢你的帮助!

// Abstract class.
class A {
public:
  void run() { while (call()) { /* ... */ } }
private:
  virtual bool call() = 0;
};

// Completion/specialization of A.
class B : public A {
private:
  // Standard term to indicate this pattern?
  bool call();
};

摘要:这似乎被称为非虚拟接口模式,这是模板方法模式的特例。感谢Nick和Steven的帮助!

4 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

这有时称为“非虚拟接口”(或NVI)模式。它通常在虚函数的实现需要在派生类之间变化时使用,但基类需要控制何时调用函数。

例如,基类可以在虚拟调用之前或之后进行另一个函数调用,而不是将虚函数公开并依赖覆盖来自行调用基本实现(并且在正确的时间!)

答案 2 :(得分:1)

我听说您的界面中没有任何virtual功能的模式为非虚拟接口模式,简称​​ NVI

在其他情境中,它被称为模板方法模式,其中run()模板方法,派生类会跳入以填补空白。

答案 3 :(得分:0)

嗯......私人虚拟?为什么要发明新的术语?它是一种语言结构,而不是一种成语,在我看来,它并不足以被称为模式。