当前位置: 首页 > news >正文

面向对象编程 接口vs抽象类的区别?

一、接口VS 抽象类?

1. 抽象类和接口的语法特性?

抽象类不允许被实例化,只能被继承

它可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的方法叫作抽象方法

子类继承抽象类,必须实现抽象类中的所有抽象方法

接口不能包含属性,只能声明方法,方法不能包含代码实现

类实现接口的时候,必须实现接口中声明的所有方法。

2. 抽象类和接口存在的意义?

抽象类是对成员变量和方法的抽象,是一种 is-a 关系,是为了解决代码复用问题

接口仅仅是对方法的抽象,是一种 has-a 关系,表示具有某一组行为特性,是为了解决解耦问题,隔离接口和具体的实现,提高代码的扩展性

3. 抽象类和接口的应用场景区别?

什么时候该用抽象类?什么时候该用接口?

实际上,判断的标准很简单。如果要表示一种 is-a 的关系,并且是为了解决代码复用问题,我们就用抽象类;

如果要表示一种 has-a 关系,并且是为了解决抽象而非代码复用问题,那我们就用接口。

二、基于接口而非实现编程

1.“基于接口而非实现编程”,这条原则的另一个表述方式,是“基于抽象而非实现编程”。后者的表述方式其实更能体现这条原则的设计初衷。我们在做软件开发的时候,一定要有抽象意识、封装意识、接口意识。越抽象、越顶层、越脱离具体某一实现的设计,越能提高代码的灵活性、扩展性、可维护性。

2. 我们在定义接口的时候,一方面,命名要足够通用,不能包含跟具体实现相关的字眼;另一方面,与特定实现有关的方法不要定义在接口中。

3.“基于接口而非实现编程”这条原则,不仅仅可以指导非常细节的编程开发,还能指导更加上层的架构设计、系统设计等。比如,服务端与客户端之间的“接口”设计、类库的“接口”设计。

三、多用组合少用继承设计思想

1. 为什么不推荐使用继承?

继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。在这种情况下,我们应该尽量少用,甚至不用继承。

2. 组合相比继承有哪些优势?

继承主要有三个作用:表示 is-a 关系,支持多态特性,代码复用。而这三个作用都可以通过组合、接口、委托三个技术手段来达成。除此之外,利用组合还能解决层次过深、过复杂的继承关系影响代码可维护性的问题。

3. 如何判断该用组合还是继承?

尽管我们鼓励多用组合少用继承,但组合也并不是完美的,继承也并非一无是处。在实际的项目开发中,我们还是要根据具体的情况,来选择该用继承还是组合。如果类之间的继承结构稳定,层次比较浅,关系不复杂,我们就可以大胆地使用继承。反之,我们就尽量使用组合来替代继承。除此之外,还有一些设计模式、特殊的应用场景,会固定使用继承或者组合。

http://www.dtcms.com/a/192429.html

相关文章:

  • 如何快速入门-衡石科技分析平台
  • (十九)Java集合框架深度解析:从基础到高级应用
  • 第28周——InceptionV1实现猴痘识别
  • K8S Gateway AB测试、蓝绿发布、金丝雀(灰度)发布
  • next.js实现项目搭建
  • 023-C语言预处理详解
  • 致远OA周报日报管理应用包【附百度网盘下载链接,官方售价8K】
  • 采用sherpa-onnx 实现 ios语音唤起的调研
  • 机器学习 --- KNN算法
  • uniapp在APP上如何使用websocket--详解
  • 驱动-定时-秒-字符设备
  • 2025年叉车证备考题库精选含答案
  • Kotlin 和 Java 混合开发时需要注意哪些问题
  • Vue 3 实现后端 Excel 文件流导出功能(Blob 下载详解)
  • 软考软件评测师——软件工程之系统维护
  • 开机自启动python程序_ubuntu22.04
  • 帧差法识别
  • Ubuntu下配置VScode出现#include错误请更新includePath的解决方法
  • Servlet原理
  • 织梦Dedecms模板文件名介绍与说明
  • Qt信号槽机制与UI设计完全指南:从基础原理到实战应用
  • 基于windows环境Oracle主备切换之后OGG同步进程恢复
  • CSP-J/S初赛知识点:计算机网络与Internet基本概念知识点
  • GCC 使用说明
  • maven报错 You have to use a classifier to attach supplemental artifacts
  • EtherCAT转EtherNet/IP解决方案-泗博网关CEI-382
  • AI、机器学习、深度学习:一文厘清三者核心区别与联系
  • SSM项目集成redis、Linux服务器安装redis
  • idea启动报错:java: 警告: 源发行版 11 需要目标发行版 11(亲测解决)
  • InforSuite AS 可以发布django和vue项目是否可行