论坛首页 Java企业应用论坛

论接口与抽象类的真正区别

浏览 7100 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-03-30   最后修改:2010-04-19

     关于接口与抽象类的区别, 有着千篇一律的答案,我就不重复那些了, 什么可以实现多个接口,但只能继承一个类;抽象类中可以有方法是的实现,而接口没有, 等等......

     那都没有说错,但没有说的问题的关键. 为什么接口跟抽象类有那些不同, 这些不同的根源是什么? 根源是它们的真正含义,或说作用是截然不同的. 不同在哪里? 一言以辟之, "抽象类是为了把相同的东西提取出来, 就是为了重用; 而接口的作用程序里面固化的契约, 是为了降低偶合." 下面进行详细阐述.

     先说抽象类, 它的作用归根到底其实就是为了重用. 这个重用包含几个层次的重用, 都知道的方法重用, 几个类有共同的特质, 我们就把他们公用的东西提取出来, 搞了个父类, 而这个父类有些方法不知道怎么实现, 就搞成抽象的吧. 所以抽象类就诞生了. 还有一个重用层次是结构的层次, 很典型的就是 Template模式, 它重用的不是一般的方法,而是做某类事情的通用算法,我称之为结构的重用.

     再谈接口, 这是我想重点说的, 因为我想让接口真正回归它本来的面目. 接口就是契约, 软件系统内部的契约. 那电脑硬件打比方, 内存条的卡口就规定好多长,卡位在哪. 这样造主板的按这个契约留好口, 造内存的外形也按这个造, 都造好了, 才能工作. 任何一方不守规矩,直接导致造电脑失败. 这个造电脑, 主板跟内存接口是什么? 是我们看到的主板上那个卡口吗? 不是, 接口是内存厂商跟主板厂商之间的契约, 这份契约可能是一份双方签字的文档,也可能是一个电话达成的共识.  而编程语言的接口Interface, 就对应那分签字的文档或是一个电话的共识, 只是它是程序化了的, 相关双方都没有办法违约的;我告诉你了我要这个接口, 你也答应实现, 那你就必须实现, 否则编译就过不了; 所以它是一种固化的强制的契约.

   搞清楚了接口跟抽象类的这个本质区别, 它们真正的作用. 就不会再说"这个地方, 用抽象类还是接口都可以"这样的话. 也许的确是都可以,但是该用哪个呢?

 

 

     ----------------

     本贴在论坛隐藏,但大虾们并没有说出像样的不同意见. 在此补充一下,

      当一个类实现一个接口,就是对所有其他“人”说,我现在可以做这个事情了! 就是完成了interface规定的契约 或说协议。 而一个类实现另一个类时,并没有这个功能,它最多只是做了些同父类不一样的事情而已。

   发表时间:2010-03-30  
回答问题的角度不同。从语法与语言的角度说,就是“实现,继承..."的区别。在C++中根本就没有interface这个东西,需要用纯虚函数和宏模拟。如果是从设计的角度,就不应该提这个问题。它的使用场景应该是设计师对他们的最根本理解。

另外,interface却常常与抽象类在一起使用。定义了interface,经常需要用一个抽象类来吧共同的行为实现,而留下具体的行为给继承类去实现。
0 请登录后投票
   发表时间:2010-03-31   最后修改:2010-03-31
wumingshi 写道
回答问题的角度不同。从语法与语言的角度说,就是“实现,继承..."的区别。在C++中根本就没有interface这个东西,需要用纯虚函数和宏模拟。如果是从设计的角度,就不应该提这个问题。它的使用场景应该是设计师对他们的最根本理解。

另外,interface却常常与抽象类在一起使用。定义了interface,经常需要用一个抽象类来吧共同的行为实现,而留下具体的行为给继承类去实现。


1. "在C++中根本就没有interface这个东西,需要用纯虚函数和宏模拟", 那正好说明 C++中的Interface就是“纯虚函数和宏模拟”一起实现的 (本人不了解任何C++,从字面意思推测的);所以从逻辑语义来将,无论C++还是java都有抽象类跟接口的概念,当然就都有其不同的使用场景了。

2. "如果是从设计的角度,就不应该提这个问题", 用什么不用什么,恰恰就是一个设计问题,详细设计中是一定要写清楚的。

3. "interface却常常与抽象类在一起使用。定义了interface,经常需要用一个抽象类来吧共同的行为实现", 恕不敢苟同, 就像男人跟女人一样,他们可以结婚一起生活,也可以选择单身,或是Gay都是完全允许的。 需不需要一起使用, 就如同wumingshi所说,要看场景,并非他们天然就需要一起用,或是一起用更好。
0 请登录后投票
   发表时间:2010-03-31  
http://topic.csdn.net/u/20100312/10/822b0e94-8d2f-4bf0-9746-3424eaea40ce.html
这是我在CSDN上的帖子,讨论了接口和内部类的区别
0 请登录后投票
   发表时间:2010-03-31  
接口 本来就是一个含糊不清 有争议的翻译
所以怎么答都有理
0 请登录后投票
   发表时间:2010-03-31  
公有方法就是接口
0 请登录后投票
   发表时间:2010-03-31  
经验之谈,写的不错
0 请登录后投票
   发表时间:2010-03-31  
曾经一个领导问我这个问题,我给出了自己的想法,领导不赞同,领导的说法是:抽象类可以继承,接口不行。没理解,接口就是接口,抽象类就是抽象类,本来就是不同的东西,为什么非要拿来做比较。
0 请登录后投票
   发表时间:2010-03-31  
很多东西很难有统一的答案,只要自己知道为的是什么就可以了。毕竟有的东西只可意会,不可言传。
0 请登录后投票
   发表时间:2010-03-31  
这应该是一个软件设计的问题,一般上业务接口都是针对interface来设计, Abstract是对接口公共部分的封装。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics