【问题标题】:private overrides of private methods pattern? (ANSWER: NVI)私有方法模式的私有覆盖? (答案:NVI)
【发布时间】:2010-07-22 13:58:50
【问题描述】:

什么是被接受的行话(如果有的话)来描述只能虚拟调用的方法以及从基础中的其他方法调用的方法?我偶尔会看到这被称为回调,但这似乎与该术语的原始定义相去甚远。我什至不确定这是否值得被称为模式,但我试图在注释我的代码时变得更加精确。感谢您的帮助!

// 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();
};

总结:这似乎被称为非虚拟接口模式,是模板方法模式的一个特例。感谢尼克和史蒂文的帮助!

【问题讨论】:

  • 呃,call 不应该是protected,而不是private
  • @Steven 和@Arseny:您可以覆盖私有成员。这里应该是private
  • @Billy:你没看错,但还是让我有点抽搐。

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


【解决方案1】:

【讨论】:

  • 感谢您的链接。您能否比文章更清楚地解释这与 NVI 有何不同?至少有一次我挖出的消息来源声称它们是同义词:en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface
  • 我不相信它确实不同。实际上,您刚刚发布的链接称其为别名。
  • 没关系,Sutter 创造了 NVI 作为 TMP 的子集:gotw.ca/publications/mill18.htm(在第一个“稍后说明:”部分)
  • 无论如何,对于我正在记录的 TMP 案例来说,NVI 似乎是更准确的术语。我不得不赞扬尼克,但如果可以的话,我会投票给你两次。感谢您的帮助!
  • 不用担心积分。重要的是能识别出正确的答案。
【解决方案2】:

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

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

【讨论】:

  • 鉴于 Steven 指出我的领先优势,我想就是这样。 NVI 似乎是模板方法模式的一个特殊子集,由 Herb Sutter 在 2001 年之后的某个时间创造。
【解决方案3】:

我听说你的界面中没有任何virtual 函数的模式是非虚拟接口模式,简称​​NVI

在其他情况下,它被称为模板方法模式,其中您的run() 是一个模板方法,派生类会跳进来填补空白。

【讨论】:

  • 这实际上是回想起来最准确的答案。它只是错过了稍晚到达的投票热潮。谢谢,sbi!
  • @Jeff:谢谢夸奖,但我比第一个答案晚了不到一分钟。人们只是认为其他答案更好。
【解决方案4】:

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

【讨论】:

  • -1:是的,私有虚拟。 C++ 允许使用它们,并且它们通常用于实现模板和 NVI 模式。
  • @Billy:你同意还是不同意?
  • 因编辑而删除了反对票。如果您只有原件,那么您似乎在称 OP 愚蠢:P。
猜你喜欢
  • 2014-05-28
  • 1970-01-01
  • 2023-04-09
  • 2011-01-01
  • 2013-01-31
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多