Pau*_*eny 15 c++ virtual design-patterns template-method-pattern
来自模板方法模式的四人帮:
三个实施问题值得注意:
- 使用C++访问控制.在C++中,模板方法调用的基本操作可以声明为受保护的成员.这确保了它们仅由模板方法调用.必须重写的原始操作被声明为纯虚拟.模板方法本身不应该被覆盖; 因此,您可以使模板方法成为非虚拟成员函数.
"这确保了它们只能通过模板方法调用." 不是真的,不是吗?也可以从派生类调用原始方法(如果某些是虚拟的而不是纯虚拟的).仅仅声明原始方法private是否真的确保它们仅由模板方法调用?然后,仍然可以在子类中实现(或重新实现)私有虚拟基元方法,以提供在超类中的模板方法中定义的算法中所需的专门行为.
请参阅Herb Sutter的"虚拟性":
http://www.gotw.ca/publications/mill18.htm
在哪里他说:
准则#2:更喜欢将虚拟功能设为私有.准则#3:只有派生类需要调用虚函数的基本实现时,才能使虚函数受到保护.
我没有在GoF模板方法模式中看到派生类调用虚函数的基类实现的任何要求,那么Gang of Four为什么建议使这些函数受保护而不是私有?
Kon*_*lph 11
答案很简单:
设计模式可追溯至1994年.在这个时候,C++仍在大力发展我们今天所知的语言 - 之前的标准于1998年完成!编译器是错误的,不支持我们现在认为理所当然的重要功能.
但更重要的是,许多事情尚未被发现(特别是主流程序员).采用模板元编程,整个过程只是在同一时间 "偶然发现" .
我非常怀疑私有虚函数也是如此:GoF根本不知道这是合法的C++.或者如果是的话,它还没有成为一种惯例.
实际上,即使不考虑C++ 11,1994年被认为"好"的大多数C++代码在今天都会被认为过于复杂且容易出错.
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |