C++编程规范之39:考虑将虚拟函数生命为非公用的,将公用函数声明为非虚拟的

摘要:

    在基类中进行修改代码高昂:请将公用函数设为非虚拟的。应该将虚拟函数设为私有的,或者如果派生类需要调用基类版本,则设为保护的。

    在面向对象层次结构中进行修改是昂贵的,所以应该实施完整的抽象:将公用函数设为非虚拟的,将虚拟函数设为私有的。这就是所谓的非虚拟接口模式。

    公用虚拟函数本质上有两种不同而且互相竞争的职责,针对的是两种不同而且互相竞争的目标:

    1.它制定了接口。作为公用函数,它是类向外界提供的接口的一部分。

    2.它制定了实现细节。作为虚拟函数,它为派生类替换函数的基类实现提供了一个钩子,它是一个自定义点。

    因为这两种职责的动机和目标都不同,所以它们可能会发生冲突,因而从定义上来讲一个函数无法很好地履行两种职责。公用虚拟函数本身有两种on革命性不同的职责和两种互相竞争的目标,这是没有很好地将问题关注点分离的标志。

    通过将公用函数与虚拟函数分离,可以获得如下明显的好处。

    1.每个接口都能自然成形。将公用函数与自定义接口分离后,每个接口都能很容易地获得符合其自然需求的形式,而不用寻找折中方案,以使他们看上去相同。两个接口经常需要不同数量的函数或不同的参数。

    2.基类拥有控制权。基类现在完全控制着其接口和策略,可以实时接口的前后置条件、插入度良性代码,还可以在一个方便的可重用场所中做任何类似的工作。因此,这种为了分离而进行的“预构“能够促进良好的类设计。

    3.基类能够健壮地适应变化。以后,我们可以随意改变构思、添加前后条件检查,或者将处理工作分成更多步骤,或者进行重构,或者用Pimpl惯用法实现更完整的接口与实现的分离,或者对基类的可自定义性进行其他修改,而不会影响到使用此类或者从此类继承的任何代码。

时间: 2024-09-12 15:15:09

C++编程规范之39:考虑将虚拟函数生命为非公用的,将公用函数声明为非虚拟的的相关文章

《C++编程规范:101条规则、准则与最佳实践》——第2章设计风格设计风格 C++编程规范:101条规则、准则与最佳实践 复杂性啊,愚人对你视而不见,实干家受你所累。 有些人避而远之。惟智者能够善加消除。 ——Alan Perlis 我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程

第2章设计风格 C++编程规范:101条规则.准则与最佳实践 复杂性啊,愚人对你视而不见,实干家受你所累. 有些人避而远之.惟智者能够善加消除. --Alan Perlis 我知道,但是却又忘记了Hoare的至理名言:不成熟的优化是程序设计中的万恶之源. --Donald Knuth[1] The Errors of TeX[Knuth89] 完全区分设计风格与编码风格是非常困难的.我们将一般在实际编写代码时才用得到的条款留到下一部分介绍. 本部分集中讨论适用面比一个特定的类或者函数更广的原则和

实现高效Java编程规范的十一条基础规则

编程|规范 本文介绍的Java规则的说明分为5个级别,级别1是最基本也是最重要的级别,在今后将陆续写出其他的规则.遵守了这些规则可以提高程序的效率.使代码有更好的可读性等. (1) 避免使用NEW关键字来创建String对象 把一个String常量copy到String 对象中通常是多余.浪费时间的. Public class test{ Public void method(){ System.out.print (str); } private String str = new String

JAVA 编程规范

编程|规范 1. 应用范围 本规范应用于采用J2EE规范的项目中,所有项目中的JAVA代码(含JSP,SERVLET,JAVABEAN,EJB)均应遵守这个规范.同时,也可作为其它项目的参考. 2. 设计类和方法 2.1 创建具有很强内聚力的类 方法的重要性往往比类的重要性更容易理解,方法是指执行一个统一函数的一段代码.类常被错误的视为是一个仅仅用于存放方法的容器.有些开发人员甚至把这种思路作了进一步的发挥,将他们的所有方法放入单个类之中. 之所以不能正确的认识类的功能,原因之一是类的实现实际上

C#编程规范和惯例

编程|规范 谁都会写代码!几个月的编程经验可以让你写出"可运行应用程序".让它可运行容易,但是以最有效率的方式编码就需要下更多的功夫! 要知道,大多数程序员在写"可运行代码,"而不是"高效代码".我们在这个指南课程前面提到,你想成为你们公司"最尊贵的专业人员"吗?写"高效代码"是一项艺术,你必须学习和实践它. 命名惯例和规范 注记 : Pascal 大小写形式-所有单词第一个字母大写,其他字母小写.Came

C# 编程规范

编程|规范 C# 编码规则 一.命名 1.用pascal规则来命名方法和类型. public class TextBox { public void DataBind() { } } 2.用camel规则来命名局部变量和方法的参数. string userName; public AddUser(string userId, byte[] password); 3.所有的成员变量前加前缀 _ public class Database { private string _connectionSt

Visual Basic编程规范

visual|编程|规范 Visual Basic编程规范 1.      Visual Basic IDE(集成开发环境)设置        必须打开设置选项的"要求变量声明","对齐控件到网格","自动缩进"开关.        Tab的宽度统一为4个空格,网格单位一律设为:width 60 height 60. 2.     命名约定        (注意:在任何时候,不能使用中文及全角字符,只允许使用英文字母.下划线和数字) 2.1   

IDesign C#编程规范(一)

编程|规范 IDesign发布了C#编程规范,小鸡射手从Only4Gurus下载浏览后决心抽时间翻译一下,以更好地学习. 目录内容如下: 1 命名规则和风格 Naming Conventions and Style 2 编码惯例 Coding Practices 3 项目设置和结构 Project Settings and Structure 4 Framework特别指导 Framework Specific Guidelines 4.1 数据访问 Data Access 4.2 ASP.NE

IDesign C#编程规范(二)

编程|规范 续之一,小鸡射手接着翻译了IDesign编码规范的第二章前部. 2 编码惯例 Coding Practices 1. 避免在一个文件中放多个类. Avoid putting multiple classes in a single file. 2. 一个文件应该只对一个命名空间提供类型.避免在同一文件中有多个命名空间. A single file should only contribute types to a single namespace. Avoid having mult

IDesign C#编程规范(之四)

编程|规范 续之三,本文是IDesign C#编程规范的第三章. 3 项目设置和项目结构 Project Settings and Project Structure 1. 总是以4级警告建立项目(图略). Always build your project with warning level 4 2. 在发布版中将警告作为错误(注意这不是VS.NET的缺省设置)(图略). Treat warning as errors in Release build (note that this is