今天我们来谈一谈面向对象中的抽象类和接口。
java为什么会有接口?很多人可能会说因为java中没有多继承,所以要设计接口。但么问题来了,java为什么没有多继承呢?
现在的高级语言基本都是基于C/CPP衍生而来的。java可以说是cpp的”简洁版”,把Cpp中的一些不明显的,容易误解的概念删去或剥离出来。比如头文件换成了package,删去了显式意义上的指针,默认参数必须用重载实现,天生多态的概念等等。虽然java也有一些自己独特的设计,例如反射等等(有cpp的外部库也能实现反射),这里不介绍了。
那么为何会从cpp中剥离出接口这个概念呢?其实在cpp中也可以说是有接口的,只是没有显式的这种概念。我们之前在cpp开发的时候可能很多人都会有这种烦恼–多继承,多继承在cpp中是很避讳的,因为不清楚概念的开发人员极有可能出现菱形继承..什么是菱形继承呢。就是两个子类继承自一个父类,而又有子类同时继承这两个父类,无疑这种行为会在类中产生二义性。最致命的是cpp并不检测这种行为,无形间加大了维护的难度。所以为了有的c/cpp开发人员为了防止多继承产生的二义性问题和资源重复拷贝问题,会使用虚继承,并把虚基类声明为这样的:
类中没有定义任何的成员变量
所有的成员函数都是公有的
所有的成员函数都是纯虚函数
接口是一种特殊的抽象类
其实也可以不用这样设计,但是这样设计的”接口”在多继承是肯定不会出现二义性和菱形继承的问题的。
这就是java中接口的原型,我认为,与其说接口是为了弥补多继承,不如说接口是为了设计人员而生。
有兴趣的同学可以了解一下python中的多继承,用了mro算法+super关键字处理菱形继承
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!