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

前言:

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

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



一、我对二者的定义:


    1、关于接口的定义:

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

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


二、相同点:


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


三、不同:

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

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


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


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


五、总结:


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



面向对象的编程中,C语言并不直接支持类和抽象的概念。引用中提到,final关键字用来修饰方法,表示该方法不能在子类中被覆盖。而abstract关键字用来修饰抽象方法,表示该方法必须在子类中被实现。然而,在C语言中,没有对应的关键字来实现类和抽象的概念。 相反,C语言通过结构体来模拟类的概念。结构体是一种用户自定义的数据类型,可以包含多个不同类型的数据成员。通过结构体,我们可以将相关的数据和功能组合在一起。然而,C语言中的结构体不支持继承和多态等面向对象的特性。 在C语言中,我们可以使用函数指针来模拟抽象类和接口的概念。函数指针可以指向不同的函数,通过使用函数指针,我们可以实现多态性,即在运行时根据函数指针指向的具体函数来执行不同的操作。 综上所述,C语言并不直接支持面向对象中的类和抽象的概念,但可以使用结构体和函数指针来实现类似的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [面向对象——类和对象](https://blog.csdn.net/shouyeren_st/article/details/126210622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [面向对象编程原则(06)——依赖倒转原则](https://blog.csdn.net/lfdfhl/article/details/126673771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值