学习的目的不仅在于求取新知识,拓展人的眼界以及想象的边界,给予人处理未知事物的能力。而且在于消化旧知识,使用崭新的观点和角度,对已知的知识进行整理,形成更加简洁和本质的知识网络,提高人对已知事物的处理能力。
我习惯称后者为认知转变,因为这种学习在知识的量的方面没有很大的贡献,但是在知识的组织和利用上却与之前有显著区别。
Java是一种面向对象的程序设计语言,是对象型编程思想的一种载体,这里所讨论的内容其实超出了编程的范围,而是将这种思想运用在知识的重新组织上。这些内容或许有很多人都讲述过了,但是我一向认为,学习是非常个人化的事情,即使旁人再怎么清楚明白,相关的论述堆积如山,也不应该因此闭口不言,而应结合自身经历讲出自己的理解与看法,不然,知识就变成了一种抽象的东西了。
一、接口模型
1.接口的引入
接口,这个词总是让人摸不着头脑,因为在日常生活中并没有这个词,往往作为技术词汇而出现,像网络接口,数据接口,程序接口等等,于是就很难说明他到底是个什么东西。不过,总是可以使用更加形象的的东西来描述,比如说插头,各种电器的插头,就是所谓的接口,这些插头需要插到插座上,我们都知道这些插头的作用就是给电器提供电流,有了电,电器才能工作,于是,可以说电器的接口也就是插头,起到的作用是传输电流。将这个说法模糊化,就得到了一种比较形象的理解,接口就是用来传输某种东西的,比如,数据接口,就是传输数据,也就是成为比特流的东西,传输实物总是需要某种实体作为媒介,就像声音的传播需要空气,电流的传输需要电线,石油的传输需要管道,所以数据的传输也需要某种媒介,一般就是数据线。
当然,这肯定还不是接口的完全定义,想要完全定义它往往需要借助于抽象的语言,不过通过上面的具体例子总可以给抽象的东西一个看得见的模型。考虑网络接口,也就是和网线连接的部分,可以看到是好几根线,那么按照上面给出的例子,他传输的什么东西呢?其实也是数据,因为信息,总可以编码成二进制数据,通过变化的零一序列表示,称为数字信号,数字信号可以转换为对应的电压的波形,通过铜线传输,于是,网络接口,就是通过铜线传输数字信号来传输数据的。这一个例子中,出现了一个变化,那就是具体传输的东西和我们实际想要传输的东西可以不一样,只要存在一种转换机制可以彼此转换。于是,接口的定义就更加广泛了,首先我们有基础的数据通路,也就是数据和数据传输载体,然后只要通过某种转换机制,可以将一个东西转化为数据,就可以称我们有了这个东西的接口。于是,可以给出一些例子,图像是一种特殊的数据,可以转化为数据,所以有图像接口,视频也是一种特殊的数据,就有视频接口,程序也可以转换为数据,就有程序接口。因此,基于数据传输与转换,我们就有了一系列的抽象的接口。
2.例子
接口的例子,首先考虑Java中的例子,往往就是指一些方法,对象将一堆东西封装起来,通过一些参数表示其状态,通过一些方法可以切换其状态,举个例子,考虑实际的鼠标和屏幕上的光标,我们可以将光标的位置作为状态参数,将鼠标移动作为方法,称为一个光标类,当我调用鼠标右移的方法,也就是我实际向右移动鼠标,屏幕上光标的位置就发生了变化,也向右移,于是,这一过程就可以抽象为我调用了某一方法,切换了光标的状态。还有许许多多的例子,比如水瓶类,调用了打开方法,水瓶的盖子就打开了。这种描述虽然看上去没什么用处,说的不是废话吗?但是,当我们脱离了日常生活环境,不再亲手实现某一操作时,就可以发现这种描述思想的巨大威力。
让我们看一个不那么显然的例子,考虑电脑的开机过程,我们所做的仅仅是按一下开机按钮,电脑的状态却发生了一连串让人目不暇接的变化,屏幕亮起,进度条载入,数据审查,直至出现桌面,整个状态切换过程如此复杂,而我们做的仅仅是调用了开机方法。对于从未见过的人而言就像魔法一样。我们还可以考虑一些假想的例子,比如,人们实现了开关太阳的方法,只用一个按钮,太阳就被巨大的黑幕完全遮起来了,白天直接变成无月的夜晚,再按一下,太阳又被放出来了。这个过程简直是无法想象的复杂,但是又是如此的简单,只需要一个按钮罢了。
上面这些例子其实就给出了这种思想最有用的地方了,虽然具体实现一个功能可能非常非常复杂,但是,使用接口的概念,我们总可以将其简化为一个按钮,或是任意一个简单的动作。最大的作用就是简化简化再简化,一个专业软件,其实现原理可能需要一个团队花费数十年的时间去完成,但是,使用他却只需要一个普通人花费很短的时间就可以做到。
3. 推广
现在,让我们的目光放远一些,不再局限于编程啦,软件啦,考虑社会生产,就会发现,这种思想简直无处不在,人机交互往往就有这种考量,一个工具,制造出来之后,就不断地改进,一个是增强功能,另一个是改善体验,提供更好的使用手感。于是,按照这种想法,我们就把人分成了两类,一类是专注于制造功能更加强大的工具,称之为制造者,还有一类不需要知道工具是如何做出来的,而只需要知道如何使用这些工具来完成特定的任务,称之为使用者。这种分工在社会生产中非常普遍,程序编写不过是这种分工的一个实例罢了,可以说这就是行业发展的必然结果,在生产领域其实就是标准化的过程,在野蛮生长之后,慢慢的发展方向就明确了,产品的形式就固定了,然后就可以商讨出来一套标准,对于一些广泛认可的功能设计加以固定,在功能还不太明确的地方各展身手。
4.商结构
结合这几天我所考虑的数学中的商结构,给出一个接口模型的描述,希望可以将抽象的数学对象变得生动一些。考虑给定集合的商集,商集中的元素就是集合中原本所含元素的分类,那么,使用对象和接口来表述这种关系,这些元素类就构成了商结构的状态参数,每一个类就对应一个状态,这些元素类之间的转化运算就是商结构的方法,通过调用这些方法,可以从一个类切换到另一个类。
这感觉不够本质,不过,姑且算是给出了一个可迁移的具体描述,这里面的商结构其实就很没有必要了,随便的一系列的数学对象,都可以构成一个类,这些对象的所有状态就构成了这个类的状态,再包含一些方法,即可以从一个数学对象的状态,变为另一个数学对象的状态的运算,这一套下来,就给出了一个具体描述。
考虑一个实例,比如整数集,以及其上的加法和乘法运算,一个特定的整数就是整数集的一个状态,通过调用双参数方法乘或加,就可以得到一个整数对象。这个例子感觉挺没意思的。不过,感觉要给出一个足够有意思的例子就需要许多背景知识了,那也不太好。只能说基本的数学对象早已被模型化了。
二、继承和多态
1.定义、描述
考虑下一个概念,继承,这也是一个非常普遍的概念了,对于一个封装好的模型,有时需要添加一些新的功能,那么往往我们不会从头开始构建,而是在现有的模型基础上稍加改动,得到一个新的模型,这一过程就称之为继承。继承往往被一种分类关系所描述,一个大类和一系列的子类,比如飞机是一个大类,飞机还包含很多子类,客机,货机,农用机,消防机等,就可以认为后面这些是通过继承飞机类而得到的,既包含飞机共有的部分,又包含其特有的部分。
2.数学模型的继承
上面的例子太过平凡了,没什么意思,还是拿数学结构来说明比较有趣。众所周知,数学模型是可以被应用于许许多多的应用领域中的,比如数学中微分方程的模型,在物理,控制,电子等等领域中都有相应的应用模型,通过对各种参数赋予特定的含义,就得到了对应的理论,在这种共有理论之外呢,往往还有很多的特殊理论,用于近似求解,通过不同领域中的特殊的物质运动规律,可以对数学模型加以有意义的简化,像忽略相互作用,一阶近似,二阶近似,差分方程近似等等,总得来说,各种应用领域的理论都可以视为对数学理论的继承。相应的,他们的模型也就是对数学模型的继承。通过这种继承的方法,每当基础领域出现重大突破时,往往就会出现为数众多的模型迁移的研究,极大的拓展了模型的适用范围。这就是从理论到应用的正常路线。
3.多态与通识教育
不过,我们自然要考虑相应的反问题,就像研究和设计总是紧密相连的一样,继承往往和多态联系密切。下面就解释一下多态,所谓的多态,就是各个子类中往往会体现一种统一性,不在于其内容的统一,而是思想的统一,从而可以抽象出一种共有的方法,这些共有的方法就称之为多态方法。
考虑一个例子,来自于物理中的连续性方程,这个方程几乎处处可以看到,在电磁学中具体表现为电荷守恒方程,在连续介质力学中表现为质量守恒方程,在迁移过程中就是质量,能量和动量守恒。虽然在不同的领域中其具体表现方式不同,但是其思想是一致的,也就是经过某一选定的封闭边界的某一东西的流动带来的参数的变化,等于封闭边界所包围形体中参数的变化。于是连续性方程就是一种多态方法。
既然多态性方法具有这种卓越的联系性,而且通过抽象的数学语言总能给出一种良好的定义,所以,考虑这样的教育方式,所学的主要内容就是这样的多态方法,假使我们可以将某些领域中的主要方法都抽象为多态方法,那么,通过对多态方法的学习和掌握,所起到的效果就顶得上对这些领域的同时学习和掌握,实现一种通识教育之目的。借此还可以进行知识的压缩,虽然发展这些知识花费人们数十数百年的时间,但学习他往往只需要短短的几年时间。通过这种压缩,科技的发展就不会被知识的学习所拖累。这也是回顾已学知识的必要性,学习时知识是零散的,回顾就变成了紧凑而有条理的。就像文件压缩一样。
4.通识与交叉学科之区别
交叉学科是近些年流行起来的概念,虽然都是多领域的学习和研究,通识和交叉学科还是有明显的不同的,通识在于联系,是在不同的领域间构建桥梁,实现概念的互化和互相印证,而交叉往往专指研究,之前限于特定领域的特定问题,采取关上门来搞研究,只关系自己领域的研究,对于其他领域视而不见,结果一些概念和方法只在小圈子里流动,未能广泛传播。交叉一个方面是由于现实问题的复杂性,是多学科综合的结果,单靠一个学科无法完全解决问题,所以需要通力合作,另一方面,就是要对不同领域的特殊研究方法加以借鉴和总结,以期突破认知局限,产生新的灵感。我感觉交叉在于研究,通识在于应用。
后记
不容易啊,虽然列了大纲,但在写的过程中又有了新的看法,说来,这一篇的渊源还是在于对于继承和多态的思考,一个放散,一个统一,非常有趣。其他的只能说是为了凑成一篇文章所补充的内容了。