读TIJ -7 多形性

《Think in java·第 7 章  多形性》

【面向对象的程序设计语言三种最基本的特征:数据抽象、继承和多态】

在这个层面是没有什么“思想”好谈的!当你按照人们熟悉的、习惯的思维方式,去思考“构造和组织”程序时,你可能会觉得很自然——你具有面向对象的思想;或者,有人X按照人们熟悉的、习惯的(人的而非机器的)思维方式,给你介绍、解释数据抽象、继承和多态时,你觉得贴近生活和人的思考习惯、你觉得他讲的概念理所当然、自然(当然也浅显易懂),这是X在“思想”指导下对面向对象进行解释。面向对象的思想、面向对象范式需要从托马斯?库恩的范式(paradigm)论、面向对象设计的各种原则和软件工程原则中获得,通常这是作者的事情。

本章中,作者希望讲述的是其实是【p148 抽象类和Java接口在程序设计中的重要作用。在代码中要尽可能地使用(依赖)抽象类型,而非具体类。】,但是他没有根据OCP、“针对接口编程”展开,而是以多态这个术语为根据地而四处游击,给我的感觉有些隔靴搔痒。

所以,第一段【“多形性”(Polymorphism)从另一个角度将接口从具体的实施细节中分离出来,亦即实现了“是什么”与“怎样做”两个模块的分离。利用多形性的概念,代码的组织以及可读性均能获得改善。此外,还能创建“易于扩展”的程序。无论在项目的创建过程中,还是在需要加入新特性的时候,它们都可以方便地“成长”。】

你最好把文中的多形性,替换成抽象类型(Java中的抽象类和Java接口)——如果不那么理论苛求的话,用父类型(较大的适用面的类型)也可,即:

抽象类型(父类型)从另一个角度将接口从具体的实施细节中分离出来,亦即实现了“是什么”与“怎样做”两个模块的分离。利用抽象类型,代码的组织以及可读性均能获得改善。此外,还能创建“易于扩展”的程序。无论在项目的创建过程中,还是在需要加入新特性的时候,它们都可以方便地“成长”

多态,handle(A xx),对于客户程序,A是其各种各样子类的占位符。父类——通常是抽象类型,把它的子类们归结成同一个概念,在程序中以一个名词来看待它的所有子类,从而屏蔽子类的具体类型。父类、抽象类型的作用正是通过多态而体现。

7.1  上溯造型

把一个子类引用赋值给父类的引用变量,称为向上造型(upcasting)。如

Sup s = new Sub();  // Sup为父类

doSth(Sup s) 调用语句  doSth(new Sub())

7.1.1  为什么要上溯造型  要我说的话:“编程时,doSth(Sup s)等都是针对父类型Sup(假设Sup是动物) 编写的,那么你的Sub是猫、狗和马都被统一处理。要统一处理,就要向上造型。”我不喜欢作者的写法,至少我看这一节时,我按照他的文字【这个程序看起来也许显得有些奇怪。为什么所有人都应该有意忘记一个对象的类型呢?……】搞半天,就是用福尔摩斯的方式叙述一个极其自然的事情,而且还给出一个看似很厉害其实很无聊的例子——还是反面例子,最后,才说【但假如只写一个方法,将基础类作为自变量或参数使用,而不是使用那些特定的衍生类,岂不是会简单得多?也就是说,如果我们能不顾衍生类,只让自己的代码与基础类打交道,那么省下的工作量将是难以估计的。】

7.2  深入理解

7.2.1  动态绑定

7.2.2  产生正确的行为   参考:什么是多态(polymorphism)

7.2.3  扩展性 还是上面的话,编程时,doSth(Sup s)等都是针对父类型Sup(假设Sup是动物) 编写的,那么你的Sub出现了新的动物,如羊、鸡……【可根据自己的需要向系统里加入任意多的新类型……这样的程序具有“扩展性】

【假设我们在基础类里加入更多的方法,以及一系列新类,那么会出现什么情况呢?】类图、代码和【可以看到,在围绕 tune()方法的其他所有代码都发生变化的同时,tune()方法却丝毫不受它们的影响,依然故我地正常工作。这正是利用多形性希望达到的目标。我们对代码进行修改后,不会对程序中不应受到影响的部分造成影响。此外,我们认为多形性是一种至关重要的技术,它允许程序员“将发生改变的东西同没有发生改变的东西区分开”。】

完全不理解这一段想说什么。

public static void doSth(Sup s) {
	// ...
	s.m();
}

在上面的代码的条件下,doSth(Sup s)统一处理Sup的各种各样的子类,而doSth(Sup s)仅仅涉及Sup的接口m()。假设Sup没有子类,它有接口m1()、m2(),你删除了m1()、m2()对doSth(Sup s)有影响吗?你添加Sup的接口m8()、m9()对doSth(Sup s)有影响吗?不考虑多形性也没有任何影响,这个“不受影响”与多态有一毛钱的关系?是不是要告诉我们一个真理:不会对程序中不会受到影响的部分造成影响。

7.3  覆盖与过载

这个例子...

7.4  抽象类和方法

7.5  接口

翻译啊,3rd中An interface can also contain fields, but these are implicitly static and final. ,我不相信会出现导致“接口也包含了基本数据类型的数据成员,但它们都默认为 static 和 final”这种结果的原文。

我不喜欢“将其想象为一个“纯”抽象类”、构造器是特殊的方法 这样的话。

7.5.1 Java 的“多重继承”

7.5.2  通过继承扩展接口 子接口

7.5.3  常数分组 “接口是对常数值进行分组的一个好工具”,不是好主意。

7.5.4  初始化接口中的字段 用随机数来初始化。

7.6  内部类

我在介绍【9.3 事件驱动编程】特别是回调之后才介绍9.4嵌套类型。匿名类是Java实现回调的基本方式,也是Java引入嵌套类型的主要原因,而现在有了λ表达式。先跳过本节,要好好思考一下这部分应该怎样处理。

读TIJ -7 多形性

时间: 2024-08-05 19:18:41

读TIJ -7 多形性的相关文章

读TIJ -1 对象入门

<Thinking In Java·第 1 章对象入门> 第 1 章约20页,是对面向对象的程序设计(OOP)的一个综述.按照其前言所述:"其中包括对"什么是对象"之类的基本问题的回答,并讲述了接口与实现.抽象与封装.消息与函数.继承与合成以及非常重要的多形性的概念.这一章会向大家提出一些对象创建的基本问题,比如构建器.对象存在于何处.创建好后把它们置于什么地方以及魔术般的垃圾收集器(能够清除不再需要的对象).要介绍的另一些问题还包括通过违例实现的错误控制机制.反

读TIJ -3 控制程序流程

<Think in java·第 3 章控制程序流程> 这一章应该不会涉及"思想",<编程导论(Java)·0.2.2 操作符和操作数>后,将相关内容压缩成一节<第3章功能抽象·3.2实现>. 3.1 使用Java 运算符 副作用(side effect):[p98:副作用一般是针对操作(表达式)而言的,一个操作/表达式有"副作用"是指在对该表达式求值时,会改变程序的一个或多个数据,以致再次对该表达式求值时,可能会得出不同的结果.

读TIJ -4 初始化和清除

<Think in java·第 4 章初始化和清除> 本章介绍对象的创建和消除. 4.1 用构建器自动初始化 [You can imagine creating a method called initialize( ) for every class you write.]一句话的正确解读是,你(男生)将自己想象成为女生.所以,我专门用一节 < 编程导论(Java)·2.3.6 构造器不是方法>强调这一点. 4.2 方法过载 这一段解释非常经典,按照人们的日常生活介绍重载.同时

读TIJ -5 隐藏实施过程

<Think in java·第 5 章隐藏实施过程> 从第一句话,就感觉本章会令我不满意."将发生变化的东西与保持不变的东西分隔开"与封装一毛钱的关系都没有.封装变化又称OCP,与OOP的封装性无关. 关于库(中的类A)的设计,依赖库的程序B,要求库是向下兼容的.程序B依赖的是A的接口.库的创建者不管想怎样自由地进行修改与改进,前提是不修改A的接口. 这里,A的接口,表示A需要提供的服务,设计者不可能.也不会考虑该服务(的方法名.参数)未来是否保持不变或改变. 所以,JD

读TIJ -6 类再生

<Think in java·第 6 章类再生> 读TIJ -1 对象入门 中已经就代码复用性吐槽了.继承关系在结果上(不是为了代码复用而设计继承关系)为代码复用提供了新的途径. 本章看其目录就比较杂,程序员的内聚思想去哪儿了?合成复用优先--合成.继承,为什么实现继承是不好的-- 6.1 合成的语法 解释了一个例程,没有什么好说的.has_a关系. 6.2 继承的语法 [You can think of inheritance, then, as reusing the class.]Is_

读TIJ -2 一切都是对象

<第2 章一切都是对象> 1.一切都是对象.不是Bruce Eckel说的,而是Alan Kay 总结的Smalltalk 五大基本特征的第一条. 从程序设计者或源码的角度,我觉得:"一切皆对象.X" .类型type是计算机科学重要概念(类型理论type theory),从对象技术角度看,Java源码中没有不论什么对象,一切皆类型.引用变量或引用,只有没有对象.为了模拟自然(无论唯心或唯物),我杜撰了 柏拉图法则:类的世界独立存在,对象世界由类创建而来 2.杂合语言或多范式

【thinking in java】读书笔记(一)

最近开始读tij,好急性不如烂笔头,所以还是记录一下,方便以后查阅. 一.各种初始化问题: 方法重载的问题: 方法的重载,区别是靠传入方法的参数,而不是返回值.比如f(),如果是返回值的话,容易产生歧义. 方法的重载中,会出现传入参数的类型提升或者降低:比如说如果有个方法可以接受int型,如果传入一个char类型,调用该方法的话会被自动提升. 如果涉及到可变参数方法的重载问题,那么会出现一些特殊情况: static void f(float f, Character... c) { System

最近在读的书单

一.<上瘾--让用户养成使用习惯的四大产品逻辑> 感受:只看了两章,读起来很顺畅舒服,和作者的观点不谋而合. 二.<人类简史> 感受:读到一半,了解到自己的祖先只是人类的一种,原来世上有那么多物种灭绝,大部分是因为人类(特别是我们智人种),真是罪过,读起来还蛮有趣的. 三.<自私的基因> 感受:刚看序,非常有意思,会继续读下去. 相比一些著名小说,这种不枯燥的带科普性质的书更吸引我,小说开始总是进入不到情节里,非得读了几章,又没那耐心┑( ̄Д  ̄)┍ 四.<大话设

儿童英语学习方法----读原版学英语

本文为摘抄网上某位家长的心得. 目的:帮助孩子从学英语过渡到用英语学习,让孩子在早期就养成用英语阅读的习惯,形成快速高效的阅读能力 1)跟读原版动画片. 动画片:<卡由>,<成长的烦恼> 内容: 以口语和日常生活对话为主. 方法: 看视频一遍,然后听音频.说明:几分钟的音频反复听,跟读(跟读的时候要求说成几乎一模一样的语音语调和速度). 不会的单词查出意思来,目的是懂得自己在说什么.但是只在文本上做标记,不注写中文意思,也不要求背单词. 让孩子在脑海里把英文单词跟某个场景和某个画面