面向对象——比抽象类更抽象的

前言:

    架起机房收费系统的三层结构后,开始加抽象工厂,反射的配置文件,也用到了泛型来解耦。就发现重构的目的是:一步步的抽象,一步步的解耦。其中加了IDAL层,用来灵活的处理BLL层和DAL层之间直接的依赖关系。

    重构中体会到,编码的艺术在于,你写的所有的类都是“活”的,随时可以替代。就像是小时候玩的积木,哪块和哪块都可以接起来,拼出一个不同的东西,有不同的意义。其中,默默付出的就是接口了。开始,我总是将接口和抽象类的意义混淆,师傅问的时候,也没有说到重点。现在总结一下这个小小的知识点。



一、我对二者的定义:


    1、关于接口的定义:

    接口可以理解为行为的抽象,即对“做什么”进行抽象,具体是怎么实现的,它一点也不用关心。从更高层次上说,接口是规范与实现的分离。举个例子就是,鸟儿会飞,飞机会飞,这样就可以去写一个“飞”的接口,飞机类和鸟类可以去实现这个接口。
    
    2、关于抽象类的定义:

    抽象类可以理解为对象的抽象 ,即对“是什么”进行抽象。举个例子,有三角形,有正方形,他们更高层次的抽象就是他们都是形状这个类。


二、相同点:


    1、都不能被实例化
    2、都包含为实现的方法声明
    3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员


三、不同:

    
    1、抽象类可以只实现部分方法,接口则必须实现其全部方法;抽象类的方法可以有抽象方法,也可以有普通方法,接口里的方法必须是抽象方法;抽象类的方法的访问权限可以多种,接口的方法的访问权限只能是public。 
    
    2、一个类可以实现N个接口,却只能继承一个抽象类。
    抽象类的功能要远超过接口,但是,定义抽象类的代价高。你试想一下,一个子类只能继承一个超类,在这个类中你必须继承或编写所有子类的共性。虽然接口在功能上会弱化许多,它仅仅针对动作定义(范围缩小),但是一个类可以实现多个接口(个数多,代替范围小的缺陷),这样可以实现灵活的操作。

    3、接口中基本数据类型为static ,而抽类象不必。
    有人可能会有疑问,为什么接口中的属性都是static的呢?这个举个例子就好理解了,如果接口中有一个变量intA,我们通过实现它的ClassA类而改变了intA的值,那么实现接口的ClassB,ClassC中的intA变量都会跟着改变,可想而知,这样的变化会造成混乱,可见,如果不是static型,那么接口就不再具备那么高层的抽象,而是带着可变的成分。


四、实战时,抽象类 or 接口??


    基本的区分,我们掌握了,下面就是怎么使用了。什么情况下使用抽象类?什么情况下使用接口?看大话设计模式的时候,我们会发现,行为模型几乎总是通过接口而不是抽象类定义。如果依赖于抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为能够更有效地分离行为与实现,为代码的维护和修改带来方便。所以我给出的建议是:当你注重实现的层次关系的时候,避免代码大量复用,目的在于实现行为的时候,可以定义成抽象类。当你觉得这个动作,很多地方可以使用到的时候,就用接口去定义一下行为即可。


五、总结:


    这里,我就在思考,什么是抽象?抽象就是把一些不可变的东西封装在一起,而可变的东西延迟在子类中去具体的实现。通过上述的对比,不难看出接口的本意所在,实际上它是对一类事物属性和行为的高层次抽象,这里我想到了大话设计模式中的开闭原则:对修改关闭,对扩展开放。还有依赖倒转原则:针对接口编程,而非针对实现。这些原则是我们编码时刻要考虑到的宗旨,这也是我们软件开发中一致所追求的。



你可能感兴趣的:(面向对象,重构)