08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
王争
该思维导图由 AI 生成,仅供参考
在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。比如,我们可以使用接口来实现面向对象的抽象特性、多态特性和基于接口而非实现的设计原则,使用抽象类来实现面向对象的继承特性和模板设计模式等等。
不过,并不是所有的面向对象编程语言都支持这两个语法概念,比如,C++ 这种编程语言只支持抽象类,不支持接口;而像 Python 这样的动态编程语言,既不支持抽象类,也不支持接口。尽管有些编程语言没有提供现成的语法来支持接口和抽象类,我们仍然可以通过一些手段来模拟实现这两个语法概念。
这两个语法概念不仅在工作中经常会被用到,在面试中也经常被提及。比如,“接口和抽象类的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存在的意义是什么?能解决哪些编程问题?”等等。
你可以先试着回答一下,刚刚我提出的几个问题。如果你对某些问题还有些模糊不清,那也没关系,今天,我会带你把这几个问题彻底搞清楚。下面我们就一起来看!
什么是抽象类和接口?区别在哪里?
不同的编程语言对接口和抽象类的定义方式可能有些差别,但差别并不会很大。Java 这种编程语言,既支持抽象类,也支持接口,所以,为了让你对这两个语法概念有比较直观的认识,我们拿 Java 这种编程语言来举例讲解。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
抽象类和接口是面向对象编程中常用的两个语法概念。抽象类是一种特殊的类,不能被实例化,只能被继承,可以包含属性和方法的实现,子类必须实现抽象方法。而接口则不能包含属性,方法不能包含代码实现,类实现接口时必须实现接口中声明的所有方法。从设计角度来看,抽象类表示is-a关系,而接口表示has-a关系,也被称为协议。抽象类主要解决代码复用问题,而接口更侧重于解耦,提高代码的可扩展性。 文章通过Java语言的例子详细介绍了抽象类和接口的定义和特性,以及它们在面向对象编程中的应用场景和意义。此外,文章还探讨了如何模拟抽象类和接口的语法概念,包括用抽象类模拟接口、用普通类模拟接口以及动态编程语言中的duck-typing策略。 总的来说,本文深入浅出地介绍了抽象类和接口的区别及使用方法,适合读者快速了解这两个重要的面向对象编程概念。文章内容简洁明了,通过实际项目开发的角度解释了抽象类和接口的选择标准,帮助读者更好地理解并应用这些概念。同时,通过课堂讨论和重点回顾,读者可以加深对抽象类和接口的理解,并在面试等场景中更加自信地表达自己的观点。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》,新⼈⾸单¥98
《设计模式之美》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(285)
- 最新
- 精选
- helloworld『那又如何避免这个类被实例化呢?实际上很简单,我们只需要将这个类的构造函数声明为 protected 访问权限就可以了。』当把一个类的构造方法声明为protected后,在同一个包的其他类中还是可以new这个类的对象的。老师,是我想错了吗?请老师指正
作者回复: 好像我写的是有点问题,稍后更正下,多谢指出
2019-11-211737 - 我爱布丁老师举的Filter接口的例子可以用抽象类实现吗? 我觉得可以说 AuthencationFilter is a Filter, RateLimitFilter is a Filter. 如果两个Filters在doFilter里会预先做一些通用的对于RpcRequest的validation工作,或者有一些shared states,那么这样是不是就应该用抽象类实现呢?
作者回复: 可以使用抽象类。但也可以使用组合来实现代码复用。后面会讲到
2019-11-214 - 初学者抽象类做于代码复用,接口做于代码扩展
作者回复: 没错
2020-11-243 - ʸᵉ ᶠᵉᶮᵍ老师老师,我想补充一下,什么时候使用抽象类这个问题。文章中说如果要is-a关系就用抽象类,感觉这个答案有点不标准,is-a关系也可以用普通类来实现代码复用问题。更标准的答案是不是如果既有代码复用问题,子类又一定要实现多态关系的时候才用抽象类。这个答案是不是准确,请老师指点一下。
作者回复: 嗯嗯 你的表述更准确些
2020-07-2933 - 胡子高兴了老师,接口中可以定义静态成员变量吗?
作者回复: 可以的
2019-11-203 - 小乙哥接口举例的地方,添加实例Filter的地方被注释掉了
作者回复: 那是故意那么写的😂,因为那两行代码放到那里并不合适
2019-11-252 - 阿玛铭问句题外话:老师对响应式编程有研究吗?想要一门这样的课程。理由:1.josh long打造,可以代表开发技术的趋势。 2.了解的不够,高并发,类似nety 3.语言隔阂短时间无法突破。 还有一个重要的理由是我觉得老师你讲内容的思路容易理解和接受。
作者回复: 😂 没研究过响应式编程 帮不上你了
2019-11-2122 - DY既然接口能实现的功能抽象类都能实现, 为什么还要用接口?
作者回复: 在某些场景下,接口更好用,更能表达业务含义。这就类似,吃馒头能吃饱,为啥还要吃肉一个道理,更香!
2020-06-1021 - longslee咦,老师,“接口不能包含属性(也就是成员变量)”,是怎么回事?可以的呀
作者回复: 只能包含静态常量吧
2019-12-041 - 刘永超从语法特性区分抽象类和接口是比较实在的,对于语法特性,不能死记,但是理解记忆是必须的。也许对于高手来讲,语法太浅显了,但对于刚入门的人来说,语法是重要的基础。
作者回复: 嗯嗯 是的
2020-11-14
收起评论