首页 文章

为什么GoF建议在C模板方法模式实现中使用受保护(而非私有)的虚拟方法?

提问于
浏览
15

来自模板方法模式的四人帮:

值得注意的三个实施问题:使用C访问控制 . 在C中,模板方法调用的基本操作可以声明为受保护的成员 . 这确保了它们仅由模板方法调用 . 必须重写的原始操作被声明为纯虚拟 . 模板方法本身不应该被覆盖;因此,您可以使模板方法成为非虚拟成员函数 .

“这确保了它们只能通过模板方法调用 . ”不是真的,不是吗?也可以从派生类调用原始方法(如果某些是虚拟的而不是纯虚拟的) . 仅仅声明原始方法private是否真的确保它们仅由模板方法调用是不是真的?然后,私有虚拟基元方法仍然可以在子类中实现(或重新实现),以提供在超类中的模板方法中定义的算法中所需的专门行为 .

参见Herb Sutter的“虚拟性”:

http://www.gotw.ca/publications/mill18.htm

在哪里他说:

指南#2:更喜欢将虚拟功能设为私有 . 准则#3:只有派生类需要调用虚函数的基本实现时,才能使虚函数受到保护 .

我没有在GoF模板方法模式中看到派生类调用虚函数的基类实现的任何要求,那么Gang of Four为什么建议保护这些函数而不是私有?

1 回答

  • 11

    答案很简单:

    Design Patterns dates from 1994 . 在这个时候,C仍在大力发展我们今天所知的语言 - 之前的标准于1998年完成!编译器是错误的,不支持我们现在认为理所当然的重要功能 .

    但更重要的是,许多事情尚未被发现(特别是主流程序员) . 采取模板元编程,整个过程只是“偶然发现”around the same time .

    我非常怀疑私人虚拟功能也是如此:GoF根本不知道这是合法的C.或者如果是的话,它还没有成为一种惯例 .

    实际上,即使不考虑C11,1994年被认为“好”的大多数C代码在今天都会被认为过于复杂和容易出错 .

相关问题