说老饭,是因为以前就折腾过这些问题了;新炒,则是指放到如今变得流行的那些可以动态修改对象的语言的环境下。弱类在这里是指这些语言通过忽视固定类从而带来了表达能力的变化;当然,可以包括根本不带有类型系统的语言。
(强烈警告:这里讨论的弱类,和语言的强类型与否,是两码事!同样,类型系统是指管理自定义类型的系统。)
Update:鉴于此文原来的版本用作起头的信息来源不怎么靠谱,重新编辑为以这篇论文作为讨论的起点[1]。
首先大家可以在Google和Baidu上搜索object based,看看比较广泛的观点是什么。上述论文中提到,object-oriented = objects + classes + inheritance(同时这一观点在最近版本的OOAD/A仍然采用(已确实),同时这些论文或著作中都谈到了多态)。所以一些人说,是不是oo,关键要看是不是多态(后两者提供了多态的手段)。
虽然这种理解在过去主要被用在基于class的语言之中,但是!这种认识并非仅仅是在静态语言社区的共识,而是整个面向对象社区都在讨论的。
即便没有编译过程、没有类型系统,对于一个对象我们可以认为存在一个“隐式”的类型,只是咱们必须按照已知的信息人为的约束自己行为;如果具体行为(而不仅仅是其接口)都已经被固定,在运行前(相对于此文提到的编译期)我们就知道所有和它有关的*确切*信息,这就不具有多态性。
鉴于弱类语言中常见的对这种“隐式类型”进行更改,为了使得这种灵活性与面向对象的特征进行区别,我们可以做出如下考虑:即使我们通过修改这个对象产生了一个新的“隐式”类型(比如添加了一个行为),新的“隐式”类型会怎么干,如果在任何时候都是确定的,这仍然是object based的路子。
但如果我们变更一个隐式类型A的具体行为,却不修改其接口,这虽然也产生了一个隐式类型A1,但它隐藏在隐式类型A的后面;和在拥有显式类型的语言中类似,我们使用时并不知道确切的类型A1,而认为还是在使用的A,这就有了多态的能力。一般的共识是这样的方式才划归为object oriented。
为什么我在这里要用“隐式类型”一词,搞得好像还是带类型系统一样?是因为无论构造、修改对象的形式如何,都会带来实际存在的信息和约束;而一组经过相同过程构造、修改的对象,必然可以就这些特征拨拉到一起。在这里换一个词,也没啥意思;而可类比的说法有助于澄清问题。
上面所述都是针对无类语言的,可以看出无论语言具体怎样,如何实现,对于OO能力来说,都不是关键点。另一方面,这种可类比性[2],也从侧面反映了有类与否,抛开具体层面来讲,并不像我们想象的那样有很大区别。
注释1:(感谢xwang兄弟的提供)首先它是出自OOPSLA;其次,它本身内容及其作者Wegner的观点被Booch等人认可。这一点网上可以用来查证的资料,有《Best of Booch》(一本由他人编辑的Booch文集)其中采用了Wegner的说法这一点属实,同时很多网页提到[Booch 91]与[Wegner 87]对这些概念有类似的定义,但[Booch 91]的电子版找不到,未能确实。
注释2:(感谢winter-cn兄弟指出这一点)实际上,用比如原型解释带类的实现方式,也是可以说通的,在这里我们也可以看到其中的共通性。