Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 私有方法的私有重写模式?(答复:NVI)_Design Patterns_Virtual_Private_Template Method Pattern_Non Virtual Interface - Fatal编程技术网

Design patterns 私有方法的私有重写模式?(答复:NVI)

Design patterns 私有方法的私有重写模式?(答复:NVI),design-patterns,virtual,private,template-method-pattern,non-virtual-interface,Design Patterns,Virtual,Private,Template Method Pattern,Non Virtual Interface,描述方法的公认行话(如果有的话)是什么?这些方法意味着只能虚拟调用,也可以从基中的其他方法调用?我偶尔会看到这被称为回调,但这似乎与该术语的最初定义相差甚远。我甚至不确定这是否值得称为一种模式,但我正试图在注释代码时变得更精确。谢谢你的帮助 // Abstract class. class A { public: void run() { while (call()) { /* ... */ } } private: virtual bool call() = 0; }; // Com

描述方法的公认行话(如果有的话)是什么?这些方法意味着只能虚拟调用,也可以从基中的其他方法调用?我偶尔会看到这被称为回调,但这似乎与该术语的最初定义相差甚远。我甚至不确定这是否值得称为一种模式,但我正试图在注释代码时变得更精确。谢谢你的帮助

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

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

可能是一个。

可能是一个。

嗯。。。私人虚拟人?为什么要发明新的术语?这是一种语言结构,不是一种习语,在我看来,还不够有趣,不能称之为模式。

嗯。。。私人虚拟人?为什么要发明新的术语?这是一种语言结构,而不是一种习惯用法,而且在我看来,还不够有趣,不能称之为模式。

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

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

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

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


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

我听说,在界面中没有任何
virtual
功能的模式是非虚拟界面模式,简称NVI


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

我听说,在界面中没有任何
virtual
功能的模式是非虚拟界面模式,简称NVI



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

嗯,不应该
调用
保护
,而不是
私有
?@Steven和@Arseny:你可以覆盖私有成员。这里应该是
private
。@比利:你没有错,但这仍然让我有点紧张。嗯,不应该
调用
保护
,而不是
private
?@Steven和@Arseny:你可以覆盖private成员。这里应该是
private
。@比利:你没有错,但这仍然让我有点紧张。-1:是的,private virtuals。C++允许它们,它们对于实现模板和NVI模式是很常见的。@比利:你同意还是不同意?删除编辑的结果。如果你只有原件,看起来你把OP叫做愚蠢的:P.-1:是的,私人虚拟人。C++允许它们,它们对于实现模板和NVI模式是很常见的。@比利:你同意还是不同意?删除编辑的结果。如果你只有原件,看起来你把OP叫做愚蠢:P。谢谢你的链接。你能比这篇文章更清楚地解释一下这与NVI的区别吗?至少有一次,我从资料中找到了它们是同义词的说法:我不相信它们有什么不同。事实上,你刚刚发布的链接称之为别名。不管怎样,萨特创造了NVI作为TMP的一个子集:(在第一个“后注:”部分中)无论如何,NVI似乎是我正在记录的TMP案例的更精确的术语。我不得不赞扬尼克,但如果可以的话,我会投你两次票。谢谢你的帮助!不要担心要点。重要的是正确的答案可以被识别。谢谢你的链接。你能比这篇文章更清楚地解释一下这与NVI的区别吗?至少有一次,我从资料中找到了它们是同义词的说法:我不相信它们有什么不同。事实上,你刚刚发布的链接称之为别名。不管怎样,萨特创造了NVI作为TMP的一个子集:(在第一个“后注:”部分中)无论如何,NVI似乎是我正在记录的TMP案例的更精确的术语。我不得不赞扬尼克,但如果可以的话,我会投你两次票。谢谢你的帮助!不要担心要点。重要的是正确的答案能够被识别。考虑到史蒂文给我指出的领先优势,我想就是这样。NVI似乎是模板方法模式的一个特殊子集,由Herb Sutter在2001年后的某个时候创造。鉴于Steven指出的领先优势,我认为这就是它。NVI似乎是模板方法模式的一个特殊子集,由Herb Sutter在2001年后创造。这实际上是回顾过去最精确的答案。它只是因为来得稍晚而错过了投票的高峰。谢谢,sbi@杰夫:谢谢你的表扬,但我比第一个回答晚了不到一分钟。人们只是认为其他答案更好。这实际上是回顾过去最准确的答案。它只是因为来得稍晚而错过了投票的高峰。谢谢,sbi@杰夫:谢谢你的表扬,但我比第一个回答晚了不到一分钟。人们只是认为其他答案更好。