设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?

决定使用抽象类还是接口
应用场景
模拟实现
定义和区别
抽象类和接口

该思维导图由 AI 生成,仅供参考

在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设计原则,使用抽象类来实现面向对象的继承特性和模板设计模式等等。
不过,并不是所有的面向对象编程语言都支持这两个语法概念,比如,C++ 这种编程语言只支持抽象类,不支持接口;而像 Python 这样的动态编程语言,既不支持抽象类,也不支持接口。尽管有些编程语言没有提供现成的语法来支持接口和抽象类,我们仍然可以通过一些手段来模拟实现这两个语法概念。
这两个语法概念不仅在工作中经常会被用到,在面试中也经常被提及。比如,“接口和抽象类的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存在的意义是什么?能解决哪些编程问题?”等等。
你可以先试着回答一下,刚刚我提出的几个问题。如果你对某些问题还有些模糊不清,那也没关系,今天,我会带你把这几个问题彻底搞清楚。下面我们就一起来看!

什么是抽象类和接口?区别在哪里?

不同的编程语言对接口和抽象类的定义方式可能有些差别,但差别并不会很大。Java 这种编程语言,既支持抽象类,也支持接口,所以,为了让你对这两个语法概念有比较直观的认识,我们拿 Java 这种编程语言来举例讲解。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

抽象类和接口是面向对象编程中常用的两个语法概念。抽象类是一种特殊的类,不能被实例化,只能被继承,可以包含属性和方法的实现,子类必须实现抽象方法。而接口则不能包含属性,方法不能包含代码实现,类实现接口时必须实现接口中声明的所有方法。从设计角度来看,抽象类表示is-a关系,而接口表示has-a关系,也被称为协议。抽象类主要解决代码复用问题,而接口更侧重于解耦,提高代码的可扩展性。 文章通过Java语言的例子详细介绍了抽象类和接口的定义和特性,以及它们在面向对象编程中的应用场景和意义。此外,文章还探讨了如何模拟抽象类和接口的语法概念,包括用抽象类模拟接口、用普通类模拟接口以及动态编程语言中的duck-typing策略。 总的来说,本文深入浅出地介绍了抽象类和接口的区别及使用方法,适合读者快速了解这两个重要的面向对象编程概念。文章内容简洁明了,通过实际项目开发的角度解释了抽象类和接口的选择标准,帮助读者更好地理解并应用这些概念。同时,通过课堂讨论和重点回顾,读者可以加深对抽象类和接口的理解,并在面试等场景中更加自信地表达自己的观点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(285)

  • 最新
  • 精选
  • helloworld
    『那又如何避免这个类被实例化呢?实际上很简单,我们只需要将这个类的构造函数声明为 protected 访问权限就可以了。』当把一个类的构造方法声明为protected后,在同一个包的其他类中还是可以new这个类的对象的。老师,是我想错了吗?请老师指正

    作者回复: 好像我写的是有点问题,稍后更正下,多谢指出

    2019-11-21
    17
    37
  • 我爱布丁
    老师举的Filter接口的例子可以用抽象类实现吗? 我觉得可以说 AuthencationFilter is a Filter, RateLimitFilter is a Filter. 如果两个Filters在doFilter里会预先做一些通用的对于RpcRequest的validation工作,或者有一些shared states,那么这样是不是就应该用抽象类实现呢?

    作者回复: 可以使用抽象类。但也可以使用组合来实现代码复用。后面会讲到

    2019-11-21
    4
  • 初学者
    抽象类做于代码复用,接口做于代码扩展

    作者回复: 没错

    2020-11-24
    3
  • ʸᵉ ᶠᵉᶮᵍ
    老师老师,我想补充一下,什么时候使用抽象类这个问题。文章中说如果要is-a关系就用抽象类,感觉这个答案有点不标准,is-a关系也可以用普通类来实现代码复用问题。更标准的答案是不是如果既有代码复用问题,子类又一定要实现多态关系的时候才用抽象类。这个答案是不是准确,请老师指点一下。

    作者回复: 嗯嗯 你的表述更准确些

    2020-07-29
    3
    3
  • 胡子高兴了
    老师,接口中可以定义静态成员变量吗?

    作者回复: 可以的

    2019-11-20
    3
  • 小乙哥
    接口举例的地方,添加实例Filter的地方被注释掉了

    作者回复: 那是故意那么写的😂,因为那两行代码放到那里并不合适

    2019-11-25
    2
  • 阿玛铭
    问句题外话:老师对响应式编程有研究吗?想要一门这样的课程。理由:1.josh long打造,可以代表开发技术的趋势。 2.了解的不够,高并发,类似nety 3.语言隔阂短时间无法突破。 还有一个重要的理由是我觉得老师你讲内容的思路容易理解和接受。

    作者回复: 😂 没研究过响应式编程 帮不上你了

    2019-11-21
    2
    2
  • DY
    既然接口能实现的功能抽象类都能实现, 为什么还要用接口?

    作者回复: 在某些场景下,接口更好用,更能表达业务含义。这就类似,吃馒头能吃饱,为啥还要吃肉一个道理,更香!

    2020-06-10
    2
    1
  • longslee
    咦,老师,“接口不能包含属性(也就是成员变量)”,是怎么回事?可以的呀

    作者回复: 只能包含静态常量吧

    2019-12-04
    1
  • 刘永超
    从语法特性区分抽象类和接口是比较实在的,对于语法特性,不能死记,但是理解记忆是必须的。也许对于高手来讲,语法太浅显了,但对于刚入门的人来说,语法是重要的基础。

    作者回复: 嗯嗯 是的

    2020-11-14
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部