其实这样的思考还可以影响到接口思维。
接口(Interface)是我们一向认为Java技术的核心,是产生边界的有效技术。可以说,当真正懂得边界思维时,会很自然地优先使用接口,因为接口是对方法的声明。
那么在Java中接口这种方式是否存在某种问题?我认为有二:
一、接口声明跟属性声明相异处理。接口是要表达“做什么”(若果用“特征”的思维,则可以理解为“是什么”),是一种声明,跟属性的声明是同一作用,但Java这种方式却把两种声明放在不同地方。
有这么一种情况:对象存在一个public的属性,而我的确想对外声明,在Java中,我们不得不要通过方法再获得这属性,因为接口不能声明属性。而另外地,方法内容硬性绑定的,为了不同的实现却要建立多个类,所以过多的类问题由此诞生。当然,这不是在批评Java,而是提出Java这方式略显累赘,相同的声明意义却要不等价地独立处理。
二、跟抽象类(abstract class)功能出现重叠情况。当然这跟当时的语言设计有关,可以从网上找到她们各自的作用和相异之处,但我觉得那是不够说服力的。任何的接口都可以用抽象类来代替,而他们都是同一作用:对外进行声明(,对内要求实现)。若果当时Java就引入函数式思维来设计,可能就会跟现在scala极为相似。
从语言层面说,边界声明能力scala更切理。毕竟其吸收了函数式的逻辑性,更具学术意味。
当然Java也可以通过Method类和抽象类来实现上面的思想,只是有点重罢了。
说出这两个问题后,scala如何实现Java的原来目的呢?
第一个就是特征思维,这就不多说了;
第二个是去掉Interface。很多人都认为trait是代替Java的Interface,其实我认为这是错误理解的。去掉Interface是因为,方法声明已与属性声明同一,已经没必要存在。而trait只是一种Mixin技术,而非Interface的代替,这两者原理和意义是相异的。
[该贴被SpeedVan于2012-05-07 17:40修改过]