我认为如果如果java中要多继承的话,首先遇到问题的就是在构造方法里面,我们知道对于每个类缺省的构造方法的第一句是隐含的super(),如果我们要产生一个子类对象,而这个子类有多于一个的父类,那么这个super()要指向哪一个呢?第一个?随机选一个?还是有超级super()可以同时实现多个?java恐怕没有这些机制。
当然,java提供了其他机制来达到类似的目的,如接口多继承(不会存在构造函数上的问题),内部类实现继承等等。
其实在Thinking in Java里面,作者已经指出——如果确定在不需要多态(把子类转为父类)的情况下,应该优先考虑组合而不是继承。
“面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个大猩猩拿着香蕉,而其还有整个丛林。” — Joe Armstrong(Erlang语言发明人)
我们也举一个大猩猩的例子,就是简单一些。比如有一个抽象的猩猩类,然后有一只拿着香蕉的非洲猩猩,还有一只拿着苹果的亚洲猩猩,现在我们需要一只同时拿着香蕉和苹果的猩猩,那么你怎么办?呵呵,其实结合前面Joe Armstrong的那句话,我们很容易就想到用接口实现多重继承是更好的解决方式。把主要的方法使用组合封装起来而避免多次实现接口的方法。而且可以根据问题的需求和复杂度来决定是否在顶层进行接口的实现等,这样不仅可以实现java低耦合,高内聚的特性,我想对内存的管理也是一中有效的方式。既然这些方法可以解决类的多继承问题,而且方便高效,何乐而不为呢?
不知见解是否准确,望同僚提意见,谢谢。
|