冒号课堂§10.2:抽象类型

冒号课堂

第十课 多态机制(2)

抽象类型——实中之虚 郑晖

摘要

介绍抽象类型的种类、意义及其用法

目录

!预览 ?提问 :讲解 ,插语 。总结 “”参考

有无相生,难易相成

—《老子•道经》 !预览

浅显的比方只是门槛前的台阶,借之或可拾级入门,却无法登堂入室

具体类型是创建对象的模板,抽象类型是创建类型的模块

抽象数据类型的核心是数据抽象,而抽象类型的核心是多态抽象

必先以术养道,而后以道御术

以社会身份而非个人身份作为公民之间联系的纽带,正是针对接口而非实现来编程的社会现实版

个体身份对应的规范抽象借助封装,以数据抽象的形式出现

家庭身份对应的规范抽象借助继承,以类型层级的形式出现

社会身份对应的规范抽象借助多态,以多态抽象的形式出现

?提问

具体类型与抽象类型的区别是什么?

抽象数据类型与抽象类型的区别是什么?

除接口与抽象类外还有其他抽象类型吗?它们有何特点和意义?

抽象类型的主要作用是什么?

在系统中应采用何种类型作为模块之间通讯的数据类型?

接口是为了克服(Java或C#中)抽象类不能多重继承的缺点吗?

接口与抽象类在语法和语义上各有什么不同?

标记接口有何作用?

:讲解

冒号调整了焦点:“鉴于目前专注的范式是OOP,参数多态最好放在以后的GP专题再作探讨。除非特别说明,下面提到的多态专指子类型多态。谈到这类多态,就不得不提及抽象类型。谁来说说,究竟什么是抽象类型?”

[…]

冒号课堂§10.1:多态类型

冒号课堂

第十课 多态机制(1)

课前导读

本课通过实例编程和对抽象类型的解读,显示了OOP中多态机制和抽象类型的重要性,有助于培养和加深读者的OOP语感。

本课共分两节——

1.多态类型——静中之动

2.抽象类型——实中之虚

 

10.1 多态类型——静中之动 郑晖

摘要

通过实例展示多态类型的三种用法

目录

!预览 ?提问 :讲解 ,插语 。总结 “”参考

动静屈伸,唯变所适

—《王弼•周易略例》 !预览

继承是多态的基础,多态是继承的目的

多态是动静结合的产物,将静态类型的安全性和动态类型的灵活性融为一体

前者(参数多态)是发散式的,让相同的实现代码应用于不同的场合

后者(包含多态)是收敛式的,让不同的实现代码应用于相同的场合

模板方法模式突出的是稳定坚固的骨架,策略模式突出的是灵活多变的手腕

?提问

多态与继承有何关系?

多态的重要意义何在?

多态有哪几种形式?它们各自有什么特点?

什么是策略模式?它与模板方法模式有何相同点和不同点?多态在其中起到了什么作用?

:讲解

当冒号迈着不变的步伐出现在教室时,手上有了一点变化:左手仍拎着笔记本包,右手却多了一样东西。大家定睛一看,原来是个电脑主板,不由得暗自纳闷:难道软件课改成了硬件课?

冒号照例直入主题:“上节课我们对继承的利弊作了详细的分析,其中最重要的观点是:继承的主要用途不是代码重用,而是代码被重用。这依赖于两个前提,一个是在语义上遵循里氏代换原则,另一个是在语法上支持多态(polymorphism)机制。因此不妨说,对于静态类型语言来说,继承是多态的基础,多态是继承的目的。”

问号忍不住问:“为什么要强调静态类型呢?”

“还记得鸭子类型[1]吗?那就是一种不依赖于继承的多态类型,也是动态类型语言一大优劣参半的特色。”冒号提醒道,“静态类型语言中的多态是动静结合的产物,将静态类型的安全性和动态类型的灵活性融为一体。它一般有两种实现方式:一种利用GP(泛型编程)中的参数多态(parametric polymorphism),一种利用OOP中的包含多态(inclusion polymorphism)或称子类型多态(subtyping polymorphism)。从实现机制上看,二者的不同之处在于何时将一个变量与其实际类型所定义的行为挂钩。前者在编译期,属于早绑定 (early binding)或静态绑定(static binding)[2];后者在运行期,属于迟绑定 (late binding)或动态绑定(dynamic binding)。从应用形式上看,前者是发散式的,让相同的实现代码应用于不同的场合;后者是收敛式的,让不同的实现代码应用于相同的场合。从思维方式上看,前者是泛型式编程风格,看重的是算法的普适性;后者是对象式编程风格,看重的是接口与实现的分离度。尽管二者从范式到语法、语义都大相径庭,但都是为着同一个目的:在保证必要的类型安全的前提下,突破编译期间过于严苛的类型限制。对于既是静态类型语言又是静态语言、既支持OOP又支持GP的C++、Java和C#而言,多态机制是保证代码的灵活性、可维护性和可重用性的终极武器。为了说明问题,我们看一个简单而实用的例子:编写一个类,让它能储存用户名和密码,以作今后验证之用。”

叹号一愣:“这题是不是太简单了?还有别的要求吗?”

冒号摇摇头。

引号却认为:“要求太少反而不好做。比如是把数据放在内存、还是文件或者数据库?密码以明文还是密文的形式存储?”

句号提出:“无论是数据的存放方式还是密码的加密方式,都不应该硬编码。”

“循此思路,我们就来编写一个可重用的抽象类。”冒号投放了一段Java代码——

/** 一个可以验证用户名和密码的类 […]

日程预估——Programmers(7)

载于《程序员》杂志09年第10期。

这个系列的漫画讲述程序员——这种神秘人类的囧事,故事多来源于我身边的程序员朋友,且以互联网开发背景为主。

如果你有什么可乐的关于程序员的故事、对话、代码,愿意通过漫画的形式分享,请给我发邮件。arthur369@gmail.com。

《冒号课堂》自序

序 郑晖

去年3月的一个下午,过于明媚的春光唤醒了一份久违的情怀,书摊上的一本《青年文摘》便成了合宜的载体。与其说是为了阅读,不如说是为了回忆——对20年前读书心境的回忆。孰料读罢开篇,怀旧之窗随即悄然关掩,一扇求新之门却戛然开启。那是一篇人物介绍,讲述一位籍籍无名的年轻人是如何因撰写博客而声名鹊起的。抚卷思之,网络平台已成大众舞台,人人皆可登台献技,自己何不前去一试?心念甫动,顿感技痒难耐,当晚寝不安席,于辗转反侧之中磨出了一本书的轮廓。

尽管钟书先生认为鸡与蛋应为松耦合关系,但一只来历不明的鸡确会招致人们对其产品可靠性的怀疑。故而在介绍《冒号课堂》的创作思路之前,先自我介绍一番。1986年我怀揣着成为数学家的梦想,考入武汉大学数学系。7年的大学生涯在浑浑噩噩中度过,毕业后在广州一所高校教了3年的高等数学。在混沌与迷茫中挣扎了10年,终于不堪蹉跎,1996年赴美攻读数学博士。始料不及的是,在大洋彼岸不仅没能一圆数学之梦,反倒从一个未曾碰过鼠标的电脑排斥者变成了一名IT工作者。“罪魁祸首”正是电脑和Internet,它们潜移默化地改变了人们的生活和思维方式,我亦未能幸免。1998年开始选修计算机课程,两年后拿到硕士学位,并在华尔街的一家软件公司找到了工作。2004年年底,选择回国发展,再度主导了人生的一次急转弯。回到广州后,顺利地进入了一家著名的外企。平淡而安逸的生活似乎注定与我无缘,不久又转去一家小公司作技术总监。如果用一句话来描述自己的职业生涯,那便是:数学是我的初恋情人,计算机是我的终生伴侣。无论成败,都是命运与人生双向选择的结果。

本书的创作虽出偶然,却也有其必然性。一方面,市面上的计算机书籍多为拼凑之作,且不少带有应试教育的痕迹。另一方面,论坛上充斥着各种谬言妄论,人们或目空一切,或人云亦云;每当争论一起,常常硝烟弥漫,出言无状者甚众。如此诸般,不忍卒睹。深感激浊扬清之必要,此念一直郁积于心,终至一朝爆发。自知虽无澄清玉宇之力,唯奢念带来一缕清风。

《冒号课堂》采用对话体,是为了借不同背景、不同水平、不同性格的人物之口,多层次、多维度、多角度地展现知识的内涵与活性。人物皆以标点符号命名,是为了塑造让人过目不忘的形象:冒号善解释,引号善引用,问号善提问,逗号善缓冲,叹号善感叹,句号善总结。此外,6个标点符号还对应着每小节的6个部分:冒号是正文讲解,引号是文献参考,问号是问题列表,逗号是补充插语,叹号是精华预览,句号是本节总结。与一般纯技术类图书不同,本书非常强调学习方法和学习精神的重要性。在内容组织上也一反常规,以思想为主、以知识为辅,以抽象为主、以具体为辅,以范式为主、以语言为辅。人们常把书籍比作一种食物,其实书籍也是一种药物。一本书应当同时提供两种价值:一种是让人获取正确知识的食用价值,一种是让人抛弃错误观点的药用价值。《冒号课堂》更侧重后者,这多少给读者带来一定的阅读障碍,因为抛弃往往比获取更加困难。此外,全书涉及的知识点较多,覆盖的知识面较广,一些流行的语言或技术反被刻意地淡化。假如读者没有足够的计算机理论和实践基础,难免会感到一些困难和不适。古语有云:“学然后知不足”,认识到不足何尝不是学习的一种收获呢?从另一面说,假如读者发现书中疏谬,还请不吝赐教,本人将不胜感激。坦而言之,随着写作的深入,自得之心日敛,惴惴之心日甚,正应了上面古语的后半句:“教然后知困”。

本书的完成首先需要感谢3位母亲:我的母亲、我太太的母亲、我女儿的母亲。没有她们默默无闻的支持和帮助,冒号课堂只能在梦中开班。还要感谢博文视点的周筠老师对本书的大力支持和关怀;白爱萍编辑负责而又耐心,不厌其烦地和我讨论一个个文字和版式的细节;博文的陈宜、杨小勤、陈琼、徐定翔、许莹、胡文佳等编辑也以同样的热情带给我很好的出版体验。我从其他亲友和网友那里也得到了许多热情的鼓励和有益的启示,是他们让虚拟的课堂变得真实和生动。

郑晖

2009年8月24日于广州

分享/保存

相关文章 2010年06月3日 — 答读者问(1)——对程序员的一些个人建议 (6) 2011年04月18日 — 答读者问(3)——再谈抽象 (1) 2011年03月20日 — 答读者问(2)——关于抽象 (6) 2010年09月20日 — 论思维的刚性与柔性(科学的迷信-3) (0) 2010年03月10日 — 《冒号课堂》在台湾上市 (5) 2010年01月1日 — 《冒号论坛》开放 (1) 2009年11月7日 — 《冒号课堂》意见收集 (58) 2009年10月26日 — 《冒号课堂》上市 (8) […]

冒号课堂§6.3:前台语言

冒号课堂

第六课 语言简评(3)

6.3 前台语言——视觉与交互的艺术 郑晖

摘要

简谈VB、Delphi和JavaScript

目录

!预览 ?提问 :讲解 ,插语 。总结 “”参考

世人反不难而易之,用是通者亦罕 

—《欧阳修•诗解统序》 !预览

Delphi让复杂的事情变得简单,VB让简单的事情变得更简单

它(JavaScript)宛如一只神奇的魔袋,乍看平淡无奇,却总能变出意想不到的宝贝

待友之道,贵在放大其优点而缩小其缺点,对待语言亦当如是

大道相通,难者亦易,易者亦难

得道者化腐朽为神奇,离道者化神奇为腐朽

?提问

Visual Basic和Delphi有何共同点和不同点?

相比其他的富客户端技术,JavaScript的前景如何?

JavaScript是一门严肃的语言吗?

前台编程、后台编程与系统编程,哪个最难?

:讲解

稍事休息后,冒号切换了话题:“接下来简单聊聊Visual Basic和Delphi。”

叹号略带得色:“Visual Basic最好用了,建个窗体,从工具箱中拖些控件,再定义一下它们的属性和行为,搞定!”

冒号点点头:“VB最大的优点就是易学易用、上手快开发快,对非计算机专业人士尤其具有吸引力。”

引号咬文嚼字:“言外之意,VB对于专业人士就不那么合适了?”

[…]

冒号课堂§6.2:平台语言

冒号课堂

第六课 语言简评(2)

6.2 平台语言——先搭台后唱戏 郑晖

摘要

简谈Java和C#

目录

!预览 ?提问 :讲解 ,插语 。总结 “”参考

大巧在所不为,大智在所不虑

—《荀子•天论篇》 !预览

Java的目的是让一种语言在多种平台上运行,而C#(.NET)的目的是让多种语言在一种平台上运行

两个平台语言(Java和C#),一个重在语言,让语言向平台扩散;一个重在平台,让平台来凝聚语言

C++提供了一马平川的大路,也提供了陷阱密布的小道;Java则在大路上铺设水泥,同时封锁了捷径小道;C#同样填平了大路上的坑坑洼洼,但把一些小道上“此路不通”的牌子悄悄换成了“此路危险”

?提问

在C++的基础上,Java 与C#作了哪些改进?

Java与C#在设计理念上有何不同?

Java与C#是如何互相借鉴的?

Java与C#为什么擅长企业应用开发?它们能作系统开发语言吗?

:讲解

逗号提出:“现在应该到了Java时间吧。”

冒号顺水推舟:“下面谈论的重心从刚才的系统语言转到平台语言——Java和C#。”

问号听得一头雾水:“平台语言?Java不是平台无关的语言吗?”

“平台的意义很广,可以是硬件平台,可以是软件平台,也可以是二者的结合。”冒号解释道,“你说的‘平台’主要指硬件和操作系统平台,而我说的‘平台’指的是运行环境平台。当然这两种平台是密不可分的,Java与C#之所以能独立于前一种平台,正因为它们自带了后一种平台。具体地说,Java运行于以Java Virtual Machine(JVM) 为核心的Java平台,而C#运行于以Common Language Runtime(CLR)为核心的.NET平台。”

句号打了个比方:“这就好比在不同的山路上铺设相同的沥青,车子跑到哪儿都没区别了。”

[…]

Category

Archives