在OOP中,自C++面世以来就已变得非常瞩目的的一个问题就是,是否所有的类最终都继承自一个单一的基类。在Java中(事实上还包括除C++以外的所有OOP语言)答案是yes, 这个终极基类的名字就是Object。事实证明,单根继承结构代理了很多好处。
在单根继承结构中的所有对象都具有一个共用接口,所以它们归根到底都是相同的基本类型。另一种(C++所提供的)结构是无法确保所有对象都属于同一个基本类型。从向后兼容的角度看,这么做能够更好地适应C模型,而且首先较少,但是当要进行完全的面向对象程序设计时,则必须构建自己的继承体系,使得它可以提供其他OOP语言内置的便利。并且在所获得的任何新类库中,总会用到一些不兼容的接口,需要花力气(有可能要通过多继承)来使接口融入到你的设计之中。这么做来换取C++额外的灵活性是否值得呢?如果需要的话——如果在C上面投资巨大,这么做就很有价值。如果是刚刚从头开始,那么像Java这样的选择通常会有更高的生产率。
单根继承结构保证所有的类对具备这些功能。因此你知道,在你的系统中你可以在每个对象上执行这些基本操作。所有对象都可以很容易地在堆上创建,而参数传递也得到了极大的简化。
单根继承结构使垃圾回收器的实现变得容易得多,而垃圾回收器正是Java相对C++的重要改进之一。 由于所有对象都保证具有其类型信息,因此不会因无法确定对象的类型而陷入僵局。这对于系统级操作(如异常处理)显得尤其重要,并且给编程带来了更大的灵活性。
- 结构复杂化,类之间的关系复杂
- 优先顺序模糊,具有复杂的父类的类,它们的优先关系一下子很难辨认清楚
- 功能冲突,当不同父类中有相同的方法时就会产生冲突
举例:比如A接口有个方法test,B接口也有个方法test,那么同时实现A和B接口的时候,test方法只有一个,没有任何歧义
而多继承的时候,A类有个test方法,B类也有个test方法,那么同时继承A和B的时候,test到底应该属于谁?是该调用A的test还是该调用B的test?这就是多继承的歧义
多继承时将多个职责混淆在一个类中,OO有单一职责原则,优先使用组合聚合,对于代码的维护性和可扩展性有好处,对于实现过个接口,这些接口的含义是不同的,有的接口是标示接口,接口的功能单一,但是有的接口是封装变化的,接口标示一种职责,这样看一个类继承多个接口,有点实现多个职责,但是这些多个接口,接口的含义是不同的。
ref http://bbs.csdn.net/topics/390102066?page=1