多维度分析:抽象类和接口的区别(抽象类与接口的区别与联系)

网友投稿 585 2022-09-12

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

多维度分析:抽象类和接口的区别(抽象类与接口的区别与联系)

在开发人员岗位面试时,是否了解抽象类和接口之间的基本区别是一个很重要的考量因素。

显而易见?

就这个问题来说,初级程序员可能都会清楚之间的区别,可能也并不一定理解其背后的原因,但其结构上的差异,特别是针对特定语言(几乎和所有的面向对象的语言一样)应该深入了解。

同时,笔者也发现其他职位候选人(有时甚至是高级职位)竟然也不知道这之间的差异,或者只知道的一个或几个。

如果只是需要了解这些内容那并不难,但这些都是面向对象的基础知识,因此想要设计良好的代码必须对其有一个深入的认识。

下面将详细介绍这些基础知识。

继承

下面将从众所周知的接口和抽象类的区别开始。这种差异是关于继承的,任何类都可以实现多个接口,但是只能扩展一个类,也只能有一个父类。

多个类扩展是一个语言特性,它存在于一些面向对象的语言。为什么呢?因为它带来的问题往往多于价值。

这样的代码通常难以维护,因为对其进行的任何修改或者重构都必须小心地检查。另一方面,如果一个类需要扩展(至少)两个拥有相同方法的类,那么 DRY 规则显然会被破坏(因此需要从别处下手),或者说会干扰到 Single Responsibility Principle (SAP)。

「如果多个类的继承如此糟糕,为什么它可以实现许多接口呢?」——如果这样的问题在你的脑海盘旋,我不得不承认这是一个绝妙的问题。

方法的可见度

然而,当涉及到抽象类时并非这样。我们总是可以有不同的类组,除了这几方面基本上不同以外,其他地方几乎一样,类体的公共方法也是非常相似的。在这种情况下,可以创建 Protected 方法来保持类之间的差异。Template Method 就是一个很典型的例子。

接口的重点在于提供特定函数,而抽象类还在于子类实现的相似性,不仅仅是其中的函数。

常量

接口和抽象类中都可以定义常量。这是因为这些值不依赖于特定对象,对它们来说都是相同的。

属性

总结

除了说明差异,笔者也试图解释它产生的原因。这不仅是因为人们发明某个语言时的突发奇想,而是源于语言背后所支撑的理念。

上一篇:为什么国内最大的 Node.js 社区将 New Relic 的监控产品换成了 ?(现在中国最大的城市)
下一篇:Cloud Insight 仪表盘上线 | 全面监控 Redis(cloud.huawei com登录)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~