抽象类和接口的区别
2015-09-15 13:00
225 查看
摘要:本文作者是Sebastian Malaca,是面向对象编程的狂热者,不断深化研究整洁代码和高代码质量。本文中,作者通过多个方面深入剖析抽象类和接口的区别,并结合经验供读者借鉴学习。
【编者按】本文作者是Sebastian Malaca,是面向对象编程的狂热者,不断深化研究整洁代码和高代码质量。本文中,作者通过多个方面深入剖析抽象类和接口的区别,并结合经验供读者借鉴学习。
在开发人员岗位面试时,是否了解抽象类和接口之间的基本区别是一个很重要的考量因素。
就这个问题来说,初级程序员可能都会清楚之间的区别,可能也并不一定理解其背后的原因,但其结构上的差异,特别是针对特定语言(几乎和所有的面向对象的语言一样)应该深入了解。
同时,笔者也发现其他职位候选人(有时甚至是高级职位)竟然也不知道这之间的差异,或者只知道的一个或几个。
如果只是需要了解这些内容那并不难,但这些都是面向对象的基础知识,因此想要设计良好的代码必须对其有一个深入的认识。
下面将详细介绍这些基础知识。
多个类扩展是一个语言特性,它存在于一些面向对象的语言。为什么呢?因为它带来的问题往往多于价值。
当一个类有许多父类时,有一个情况就是完全相同的方法会声明多个,因此必须显式地“告知”究竟需要的是哪一个。
这样的代码通常难以维护,因为对其进行的任何修改或者重构都必须小心地检查。另一方面,如果一个类需要扩展(至少)两个拥有相同方法的类,那么DRY规则显然会被破坏(因此需要从别处下手),或者说会干扰到Single Responsibility Principle(SAP)。
“如果多个类的继承如此糟糕,为什么它可以实现许多接口呢?”——如果这样的问题在你的脑海盘旋,我不得不承认这是一个绝妙的问题。
然而,答案很简单。每一个接口都是基于函数而不是一个类去实现。所以,即使实现十个不同的接口,每个包含相同的方法声明,内部也不会发生冲突。接口保证了方法的存在,而不是去说明方法的实现,这意味着,只要不违反SRP,你完全可以实现多个接口。
接着回归主题。正如上文写道的,接口是一个函数的保证,你可以把它当作使用接口的类和实现这个接口的类之间的一个合约——保证一个特定类将实现所有声明的方法。这也是为什么这些方法必须是public的原因。因为被严格的限制到了实现上,所以其他一切都不成问题。
然而,当涉及到抽象类时并非这样。我们总是可以有不同的类组,除了这几方面基本上不同以外,其他地方几乎一样,类体的公共方法也是非常相似的。在这种情况下,可以创建protected方法来保持类之间的差异。Template Method就是一个很典型的例子。
接口的重点在于提供特定函数,而抽象类还在于子类实现的相似性,不仅仅是其中的函数。
原文链接:Differences Between Abstract Class and Interface (译者/OneAPM工程师
责编/仲浩)
本文为CSDN编译整理,未经允许不得转载,如需转载请联系market#csdn.net(#换成@)
【编者按】本文作者是Sebastian Malaca,是面向对象编程的狂热者,不断深化研究整洁代码和高代码质量。本文中,作者通过多个方面深入剖析抽象类和接口的区别,并结合经验供读者借鉴学习。
在开发人员岗位面试时,是否了解抽象类和接口之间的基本区别是一个很重要的考量因素。
显而易见?
完全不是。笔者面试过很多人,通常问的第一个问题是关于接口和抽象类的区别。但实际上很少有程序员能给出正确的答案。就这个问题来说,初级程序员可能都会清楚之间的区别,可能也并不一定理解其背后的原因,但其结构上的差异,特别是针对特定语言(几乎和所有的面向对象的语言一样)应该深入了解。
同时,笔者也发现其他职位候选人(有时甚至是高级职位)竟然也不知道这之间的差异,或者只知道的一个或几个。
如果只是需要了解这些内容那并不难,但这些都是面向对象的基础知识,因此想要设计良好的代码必须对其有一个深入的认识。
下面将详细介绍这些基础知识。
继承
下面将从众所周知的接口和抽象类的区别开始。这种差异是关于继承的,任何类都可以实现多个接口,但是只能扩展一个类,也只能有一个父类。多个类扩展是一个语言特性,它存在于一些面向对象的语言。为什么呢?因为它带来的问题往往多于价值。
当一个类有许多父类时,有一个情况就是完全相同的方法会声明多个,因此必须显式地“告知”究竟需要的是哪一个。
这样的代码通常难以维护,因为对其进行的任何修改或者重构都必须小心地检查。另一方面,如果一个类需要扩展(至少)两个拥有相同方法的类,那么DRY规则显然会被破坏(因此需要从别处下手),或者说会干扰到Single Responsibility Principle(SAP)。
“如果多个类的继承如此糟糕,为什么它可以实现许多接口呢?”——如果这样的问题在你的脑海盘旋,我不得不承认这是一个绝妙的问题。
然而,答案很简单。每一个接口都是基于函数而不是一个类去实现。所以,即使实现十个不同的接口,每个包含相同的方法声明,内部也不会发生冲突。接口保证了方法的存在,而不是去说明方法的实现,这意味着,只要不违反SRP,你完全可以实现多个接口。
方法的可见度
接口中的所有方法都是public的,但对于抽象类的声明并没有这样的规则,当然不能是private。为什么不能private?因为一个抽象方法需要在子类中实现,但private无法访问子类,因此不抽象类不可能存在private属性。接着回归主题。正如上文写道的,接口是一个函数的保证,你可以把它当作使用接口的类和实现这个接口的类之间的一个合约——保证一个特定类将实现所有声明的方法。这也是为什么这些方法必须是public的原因。因为被严格的限制到了实现上,所以其他一切都不成问题。
然而,当涉及到抽象类时并非这样。我们总是可以有不同的类组,除了这几方面基本上不同以外,其他地方几乎一样,类体的公共方法也是非常相似的。在这种情况下,可以创建protected方法来保持类之间的差异。Template Method就是一个很典型的例子。
声明和定义
接口只能包含方法声明,而抽象类还可以包含方法的定义。接口的重点在于提供特定函数,而抽象类还在于子类实现的相似性,不仅仅是其中的函数。
常量
接口和抽象类中都可以定义常量。这是因为这些值不依赖于特定对象,对它们来说都是相同的。属性
抽象类可以包含属性,但接口却不能。原因与声明和定义是一样的。总结
除了说明差异,笔者也试图解释它产生的原因。这不仅是因为人们发明某个语言时的突发奇想,而是源于语言背后所支撑的理念。原文链接:Differences Between Abstract Class and Interface (译者/OneAPM工程师
责编/仲浩)
本文为CSDN编译整理,未经允许不得转载,如需转载请联系market#csdn.net(#换成@)
相关文章推荐
- 【C/C++学院】0804-C语言和设计模式(继承、封装、多态)
- Longest Consecutive Sequence
- 3D MAX制作游戏高端人物模型
- hdu 5442 Favorite Donut(最大表示法+kmp)
- MiniGUI文档参考手册 基于v1.6.10文本
- PHP 删除非法UTF-8字符
- Intel项目所用jquery小知识点总结
- 查看nginx的版本
- “TI门外汉”网路知识笔记六 VTP的原理及配置
- IM菜鸟学习之Socket聊天-简单服务器的搭建
- apache虚拟目录配置
- 第56讲:Scala中Self Types实战详解
- 自我介绍 Self Introduction
- Linux输入法问题
- fshc模块fsch2mcu_if理解
- 利用JAVA反射机制将JSON数据转换成JAVA对象
- 关东升的《iOS实战:图形图像、动画和多媒体卷(Swift版)》上市了
- 饼状图
- js实现回调功能实例
- 配流04——全有全无配流经典算法2