多态与虚拟 : 物件导向的精髓 (侯捷在石器时代对OO的理解)
【自序】
虑而後能得(自序)
故事
接触 C++ 大约是 1989 年的事。那时候的 PC 以现在的眼光看,除了「蛮荒」之外没有更合适的形容词了。横扫千军的 Windows 3.0 还没有诞生,如今以 C++ 编译器技术闻名於世的 Borland 公司那个时候也还没有踏进 C++ 领域,遑论动作更慢的 Microsoft。当时我用的编译器是 Zortech C++。
将近 10 年的历史,并不表示我在 C++ 技术上就怎麽地超凡入圣了。事实上初期我很排斥这个语言。我没有用心去体会,也就看不到其中的美好。我用数年的时间把心力全花在 Windows 技术的钻研。那时候 C++ 风潮未开,我也不以为意。
决定好好研究 C++,不是为了要开发自己的 class library,而是为了要使用别人的 class library。92 年软体界开始出现一些所谓的 application framework,是一种用来帮助程式员发展 Windows 应用软体的大型 C++ class library(如今也有非 C++ 语言的类似产品)。为了运用这些有着巨大架构以及巨大能量的 C++ class library,我必须重拾 C++。然後,为了更能操控掌握那些复杂的架构,同时也因为对技术原理有一股强烈的好奇心,我开始看 Microsoft Foundation Class(MFC) 的原始码。
这使我有了一种异於常人的学习经验。我看的是行销全世界、无数程式员使用、市场占有率最高的一套 C++ class library 的原始码。从其中,我得到许多宝贵的知识与经验。然後我慢慢体会了物件导向(Object Oriented)之美、多型(Polymorphism)之美、虚拟(Virtual)之美。
学习的路线,不一定每个人都相同。但是黑暗中摸索的日子,实在不必人人走一遭。对於位居物件导向精髓地位的「多型与虚拟」观念有了深刻体会之後,我有一股强烈的欲望,要把心得写下来。
於是我写了这本书。
层次
一般而言,C++ 是一个难学易用的语言。
C++ 的难学,初始在於其重重的布幕,布幕之中编译器对我们的程式码做了太多的手脚,使我们惯於循序思考的工程脑袋一无所措。及长又面临新的思维模式,使我们必须扭转惯常的思考习惯。
C++ 的易用则在於其巨大的弹性,能够以多型(polymorphism)、虚拟(virtual)、模板(template)等种种方式,让现有的码去处理未知的、未来的资料型态。
当然,易用必须先能用。用不好或不能用的话,「写 C++ 程式」最後就成了只是「使用 C++ 编译器」,这是大家常拿来彼此调侃的笑话。
在「难学」的背景下,「易用」是使我们依然前仆後继的动力。愈来愈多的大学资讯科系把 C++ 开在大一课程,这虽然说明 C++ 是多麽地重要,可也苦了资讯新兵们。
其实「难学」的最大症结,在於很难得有一本书,能够一针见血地指出多型与虚拟的重要性;在我们粗具语法基础之後,直接把我们导引到最核心最重要的思想,并且在建立这个思想体系的过程中,提供足够的必要基础。
我希望这本书能够做到这一点。
同样是使用 C++ 语言,有人进入了物件导向的殿堂,有人只学到 C++ 的语法;
有人练书法;
有人写毛笔字;
有人拿有毛的笔写字。
我们要向书法的境界挑战,不要只是拿有毛的笔写字。
定位
讲述 C++ 语法(syntax)的书籍很多,
讲述 C++ 语意(semantics)的书籍很少,
讲述 C++ 物件导向(object oriented)精神的书籍更少,
深入 C++ 物件模型(object model)的书籍则几乎没有。
这本书第一章对 C++ classes 的语法和语意做了一个梗概整理。第二章谈 C++ 的物件模型,第三章谈型别转型(RTTI 的重要服务),第四章谈多型与虚拟的精神,第五章实作一个大型例子,示范如何在一个 class library 中完成 RTTI、Dynamic Creation、Persistence 等基础建设。第六章为 Component Object Model(COM)奠基。
很容易看得出来,你不能够完全依赖这本书学习 C++ 语法(因为第一章不过才 96 页)。但是在学习了 C++ 语法之後,你可以依赖这本书学习物件导向的精髓。
我自己一直存在一个疑惑。别人常认为我写的是高阶技术书籍,我却认为我写的是高阶技术的入门书籍。也许我挖掘得很深很广,但,不就是要彻底了解重要的基础知识,才得登堂入室吗?
这本书,我仍旧挖得很深,尤其是第二章和第五章。但是我想粗具 C++ 语言基础的人应该都能循序接受。我渴望证明,C++ 的难学,问题不在学生,而在老师。
当然,本书的读者,你,不能够只是一位程式设计领域的全然新手。
厚薄
每次完成一本书,抱着厚厚的一叠完稿北上,父亲看到堆起来有 10 公分高的雪铜纸,总是对我说:『这麽厚的书,怎麽看』?而我总要解释『这是雪铜纸,比较厚。而且单面印刷,厚度加倍。经过雷射印表机的高温,它又有点卷...』。
但是想想,1000 页左右的书籍,再怎麽东折西扣也是厚得吓人。
渐渐地父亲不再问那个问题了,大概已经妥协於「电脑书都那麽厚」的印象之中。而我更是早就习惯看大部头的书,写大部头的书。
大家都习惯了吧!这两年 K 。
书籍的厚薄,是因於内容的选择,与读者群的界定。很难得有这麽一个题材,我以 340 页的篇幅完成了它。
书籍很薄,又经过我精心的章节次序安排与起承转合,您就不要跳着看了吧。耐着性子,一页一页,从头到尾把它好好咀嚼消化一遍。然後,如果你愿意,写信给我,我希望听到你的喜悦。
批评也是我所欢迎的。
侯俊杰 1998.07.02 于新竹
http://download.csdn.net/download/hychieftain/9510577
多态与虚拟 : 物件导向的精髓 (侯捷在石器时代对OO的理解)的更多相关文章
- 快笑死,侯捷研究MFC的原因
与我研究VCL框架代码的原因一模一样:就是N年了,感觉自己还是没有掌握Delphi,惊叹别人各种各样神奇的效果,自己却不会,更不知为什么这样做,离高手的距离还有十万八千里.而且编程的时候,就像侯捷说的 ...
- 侯捷STL课程及源码剖析学习2: allocator
以STL 的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作默默付出. 一.分配器测试 测试代码 #include < ...
- <软件架构与设计模式>侯捷老师关于Adapter类在STL中的深入解析和模式探讨
题外话:侯捷老师难得一年就来上九堂课就要会宝岛,特此留念签名赠语及合照以自勉. 学海无涯,为勤是岸 <正文开始> 昨天晚上连上了3个小时的大课探究单单讲了Adapter一个类,幸运的是本 ...
- From COM to COM 侯捷 1998.06.12
摘要: 本文簡介 C++ Object Model 和 Component Object Model 的基本概念,並引介四本書籍: 1. Inside The C++ Object Model 2. ...
- 侯捷C++ Type traits(类型萃取
泛型編程編出來的代碼,適用於任何「吻合某種條件限制」的資料型別.這已成為撰寫可復用代碼時的一個重要選擇.然而,總有一些時候,泛型不夠好 — 有時候是因為不同的型別差距過大,難以產生一致的泛化實作版本. ...
- 评侯捷的<深入浅出MFC>和李久进的<MFC深入浅出>
侯捷的<深入浅出mfc>相信大家都已经很熟悉了,论坛上也有很多介绍,这里我就不多说了. 而李久进的<mfc深入浅出>,听说的人可能就少得多.原因听说是这本书当时没有怎么宣传,而 ...
- 侯捷STL学习(一)
开始跟着<STL源码剖析>的作者侯捷真人视频,学习STL,了解STL背后的真实故事! 视频链接:侯捷STL 还有很大其他视频需要的留言 第一节:STL版本和重要资源 STL和标准库的区别 ...
- list源码4(参考STL源码--侯捷):transfer、splice、merge、reverse、sort
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
- list源码1(参考STL源码--侯捷):list节点、迭代器、数据结构
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
随机推荐
- WPF的两棵树与绑定
原文:WPF的两棵树与绑定 先建立测试基类 public class VisualPanel : FrameworkElement { protected VisualCollection Chi ...
- 北大SQL数据库视频课程笔记
Jim Gray - Transaction processing: concepts and techniqueshttp://research.microsoft.com/~gray/ 事务概念 ...
- WPF MVVM系列文章
网上搜到了MSDN Magazine上Laurent Bugnion的系列文章. 以下为关于WPF的优秀实践,很有必要阅读. 很吸引人的标题有: IOC Containers and MVVM Mes ...
- 奥格尔巧妙kfifo
奥格尔巧妙kfifo Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:O ...
- AvalonDock的基本用法
原文:AvalonDock的基本用法 AvalonDock是优秀的开源项目,用于创建可停靠式布局,能够在WPF中方便开发出类似VS2010的软件界面.对于复杂的软件系统,大量控件的使用 ...
- 编程算法 - 旋转矩阵 代码(C)
旋转矩阵 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 输出旋转矩阵, 使矩阵是按对角线螺旋上升, 在输出规则确定以后, 就能够推断, 上升规律是, ...
- MongoDB Shell 经常使用的操作
数组查询 数组查询 MongoDB 中有子文档的概念,一个文档中能方便的嵌入子文档,这与关系性数据库有着明显的不同.在查询时,语法有一些注意点. 样例代码,假如我们的一个集合(tests)中存在标签键 ...
- WPF Timeline简易时间轴控件的实现
原文:WPF Timeline简易时间轴控件的实现 效果图: 由于整个控件是实现之后才写的教程,因此这里记录的代码是最终实现后的,前后会引用到其他的一些依赖属性或者代码,需要阅读整篇文章. 1.确定T ...
- MIT墙上的格言(如果你把任务留到最后一分钟,那么你一定能在一分钟内完成任务)
1,永远不能忘记傅立叶变换. Never far no can forget Fuliye changer. 2,盲目的研究者就像法拉第和麦克斯韦之间的电学家一样无所适从. Blind Eye's r ...
- Fedora 30 安装 Gradle
当前的 Gradle 最新版本是5.4.1.您可以从发布页面下载所有 Gradle 版本的二进制文件和查看文档. 先决条件 Gradle 能够在所有主流操作系统上运行,只要具备 Java-JDK/JR ...