一、我对二者的定义:
1、关于接口的定义:
接口可以理解为行为的抽象,即对“做什么”进行抽象,具体是怎么实现的,它一点也不用关心。从更高层次上说,接口是规范与实现的分离。举个例子就是,鸟儿会飞,飞机会飞,这样就可以去写一个“飞”的接口,飞机类和鸟类可以去实现这个接口。
2、关于抽象类的定义:
抽象类可以理解为对象的抽象 ,即对“是什么”进行抽象。举个例子,有三角形,有正方形,他们更高层次的抽象就是他们都是形状这个类。
二、相同点:
1、都不能被实例化
2、都包含为实现的方法声明
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员
2、都包含为实现的方法声明
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员
三、不同:
1、抽象类可以只实现部分方法,接口则必须实现其全部方法;抽象类的方法可以有抽象方法,也可以有普通方法,接口里的方法必须是抽象方法;抽象类的方法的访问权限可以多种,接口的方法的访问权限只能是public。
2、一个类可以实现N个接口,却只能继承一个抽象类。
抽象类的功能要远超过接口,但是,定义抽象类的代价高。你试想一下,一个子类只能继承一个超类,在这个类中你必须继承或编写所有子类的共性。虽然接口在功能上会弱化许多,它仅仅针对动作定义(范围缩小),但是一个类可以实现多个接口(个数多,代替范围小的缺陷),这样可以实现灵活的操作。
抽象类的功能要远超过接口,但是,定义抽象类的代价高。你试想一下,一个子类只能继承一个超类,在这个类中你必须继承或编写所有子类的共性。虽然接口在功能上会弱化许多,它仅仅针对动作定义(范围缩小),但是一个类可以实现多个接口(个数多,代替范围小的缺陷),这样可以实现灵活的操作。
3、接口中基本数据类型为static ,而抽类象不必。
有人可能会有疑问,为什么接口中的属性都是static的呢?这个举个例子就好理解了,如果接口中有一个变量intA,我们通过实现它的ClassA类而改变了intA的值,那么实现接口的ClassB,ClassC中的intA变量都会跟着改变,可想而知,这样的变化会造成混乱,可见,如果不是static型,那么接口就不再具备那么高层的抽象,而是带着可变的成分。
有人可能会有疑问,为什么接口中的属性都是static的呢?这个举个例子就好理解了,如果接口中有一个变量intA,我们通过实现它的ClassA类而改变了intA的值,那么实现接口的ClassB,ClassC中的intA变量都会跟着改变,可想而知,这样的变化会造成混乱,可见,如果不是static型,那么接口就不再具备那么高层的抽象,而是带着可变的成分。
四、实战时,抽象类 or 接口??
基本的区分,我们掌握了,下面就是怎么使用了。什么情况下使用抽象类?什么情况下使用接口?看大话设计模式的时候,我们会发现,行为模型几乎总是通过接口而不是抽象类定义。如果依赖于抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为能够更有效地分离行为与实现,为代码的维护和修改带来方便。所以我给出的建议是:当你注重实现的层次关系的时候,避免代码大量复用,目的在于实现行为的时候,可以定义成抽象类。当你觉得这个动作,很多地方可以使用到的时候,就用接口去定义一下行为即可。
五、总结:
这里,我就在思考,什么是抽象?抽象就是把一些不可变的东西封装在一起,而可变的东西延迟在子类中去具体的实现。通过上述的对比,不难看出接口的本意所在,实际上它是对一类事物属性和行为的高层次抽象,这里我想到了大话设计模式中的开闭原则:对修改关闭,对扩展开放。还有依赖倒转原则:针对接口编程,而非针对实现。这些原则是我们编码时刻要考虑到的宗旨,这也是我们软件开发中一致所追求的。