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@杰夫:谢谢你的表扬,但我比第一个回答晚了不到一分钟。人们只是认为其他答案更好。