多态与虚拟 : 物件导向的精髓 (侯捷在石器时代对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 ...
随机推荐
- NOIP模拟 cube - 数学
题目原文: 豆豆还是觉得自己智商太低了,就又去做数学题了.一看到题,他就觉得自己可能真的一点智商都没有.便哭着跑来像 dalao 求教:如果存在正整数 A,B ,满足 A3 - B3 = x ,则称质 ...
- 【codeforces 779D】String Game
[题目链接]:http://codeforces.com/contest/779/problem/D [题意] 给你一段操作序列; 按顺序依次删掉字符串1中相应位置的字符; 问你最多能按顺序删掉多少个 ...
- NET Framework、.NET Core、Xamarin
认识.NET Core 上篇介绍了.NET 新的生态环境:包括.NET Framework..NET Core.Xamarin三驾马车 其中.NET Framework是基于Windows平台专属的开 ...
- git撤销操作总结
git checkout . #本地所有修改的.没有的提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面.可用git stash pop回复. git rese ...
- WSL探索及WSLAPI调用记录
以前都是在虚拟机上安装linux,居然刚知道win10有WSL(Windows Subsystem for Linux)可以直接在win10上安装linux,消耗低,效率高,很赞,趁着干兴趣把WSL探 ...
- [Scikit-Learn] - 数据预处理 - 归一化/标准化/正则化
reference: http://www.cnblogs.com/chaosimple/p/4153167.html 一.标准化(Z-Score),或者去除均值和方差缩放 公式为:(X-mean)/ ...
- silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发) 前面我们画了一只会飞动的小鸟,今天我们在目标是一个会发光的太阳.本章节的动画虽然简单,但是实现的效果可是一点也不打折 ...
- WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化
原文:WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化 注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及 ...
- WPF: FishEyePanel/FanPanel - 自定义Panel
原文:WPF: FishEyePanel/FanPanel - 自定义Panel 原文来自CodeProject,主要介绍如何创建自定义的Panel,如同Grid和StackPanel. 1) Int ...
- Cocos2d-x 脚本语言Lua介绍
Cocos2d-x 脚本语言Lua介绍 本篇博客记录Lua学习.学习来自eoe论坛,Lua语言开发Cocos2d-x游戏入门视频教程,猛戳下面地址: http://www.eoeandroid.com ...