接口interface的实质作用

finemi 2014-10-09 07:23:31
interface是一种约定,或者标准,约束实现了他的类所具备的方法,弥补了单继承的“缺陷”。从设计理念上讲,同abstract class比较,interface用于has a,abstract class用于is a,他们都可以通过转型来实现多态。
这些道理我都懂,但是我不明白的是:
interface里面全是抽象方法,仅仅是一个约束,那么为什么要约束?另外他可以让实现了他的类向上转型实现多态,但是我想一般不会转换为接口吧?
比如IList接口的作用
从实际应用上讲,这个约束具体的用处在何处呢?求解答...
...全文
279 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
finemi 2014-10-09
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
[quote=引用 8 楼 finemi 的回复:] 不要吓我。。向上转型,向下转型这个概念没问题吧。一个名词而已呀
我吓你什么了?我是不懂你以为是什么,却拿出来进行你的推论,所以需要你告诉一下。 我再给你明确问一下,什么叫做“转换为IList”呢?你从哪里看来的“转换”概念呢?你所理解的“转换”根本就是“指鹿为马”那种转换,而不是所谓的“向上转换 IList 类型”所说的转换![/quote] 真没见过你这么自以为是,口无遮拦,随意给人下定义、强加“罪名”的人。 看你签名“以专业开发人员为伍”,别说专业开发人员,就是小白你想去和别人为伍别人还不一定愿意。互相学习是好事,但是是建立在相互尊重的前提下,有技术是好事,但是是建立在会做人的前提下。
finemi 2014-10-09
  • 打赏
  • 举报
回复
引用 9 楼 caozhy 的回复:
C#为什么要有类型的概念,就是为了在编译时期做类型检查。 比如 dlg.Show(); 因为dlg是Form类型,有Show方法,就可以通过编译。 obj.Show(); 因为obj是object类型,没有Show方法,就不能编译。 现在我们需要一个类型,既不是具体的类型(比如Form),又表示它存在一个Show();方法,怎么办? 那就定义一个接口。
哦,懂了,谢谢
finemi 2014-10-09
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
[quote=引用 4 楼 finemi 的回复:] 书上看到的... interface是is a 么。 按照我的理解确实has a还是很贴切的呀。比如:基类Door,一个Open()和一个Close()方法,然后一个Alarm接口,具备一个Alarm()方法。 最后子类AlarmDoor继承自Door,实现Alarm接口。 因为AlarmDoor不是Alarm,而是Door,则AlarmDoor is Door,AlarmDoor has Alarm。
谁告诉你“因为AlarmDoor不是Alarm”,你把这本书说出来啊?!看看这个书的作者敢不敢同时说 AlarmDoor 不是 Alarm 啊? 是你自己完全没有接受“书上看到的...”的东西,而又喜欢用这些时髦词儿,所以才会有这些问题。[/quote] 这里只是表示一个带警报器的门,他不是一个门难道还是一个警报器?? http://www.ibm.com/developerworks/cn/java/l-javainterface-abstract/ 你要的地址,你要是觉得这文章说得不对你去找他理论吧,反正我看你也是一天闲着没事竟找人麻烦 再说了你什么时候看到我喜欢用所谓的时髦的词了,你要笑死我么。。。 不想和你说了,我是来问问题的,不是来吵架的,你要是看不惯我说的,或者认为我的理论严重侮辱了你的智商,你可以右上角点X
finemi 2014-10-09
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
你所说的“转换”,就是“把一只鸭子变为一个香蕉”的那种转换,你根本压根满脑子就没有“is-a是什么意思”的概念。基本上你的所有问题都是一个,就是压根就不理解人家说的“is-a”关系是什么。
行行行,你也是神了,口口声声硬是要曲解我意思硬是要想当然的认为我满脑子什么想法我也是醉了。 你当我基础知识不知道么,引用类型的“转换”实质是没有任何变化,他的“转换”只是给编译器看的,通俗点讲就是让编译器认为他是什么,但是他本质是没有变化的,所以他的地址和值都是完全一样的,类似于换个身份。不同于值型的转换,更像是做手术。 再说向上转型向下转型这专业名词又不是我瞎编的,我还没那能耐。 最后指鹿为马这词还真能描述引用类型的转换
  • 打赏
  • 举报
回复
引用 4 楼 finemi 的回复:
书上看到的... interface是is a 么。 按照我的理解确实has a还是很贴切的呀。比如:基类Door,一个Open()和一个Close()方法,然后一个Alarm接口,具备一个Alarm()方法。 最后子类AlarmDoor继承自Door,实现Alarm接口。 因为AlarmDoor不是Alarm,而是Door,则AlarmDoor is Door,AlarmDoor has Alarm。
谁告诉你“因为AlarmDoor不是Alarm”,你把这本书说出来啊?!看看这个书的作者敢不敢同时说 AlarmDoor 不是 Alarm 啊? 是你自己完全没有接受“书上看到的...”的东西,而又喜欢用这些时髦词儿,所以才会有这些问题。
  • 打赏
  • 举报
回复
你所说的“转换”,就是“把一只鸭子变为一个香蕉”的那种转换,你根本压根满脑子就没有“is-a是什么意思”的概念。基本上你的所有问题都是一个,就是压根就不理解人家说的“is-a”关系是什么。
  • 打赏
  • 举报
回复
引用 8 楼 finemi 的回复:
不要吓我。。向上转型,向下转型这个概念没问题吧。一个名词而已呀
我吓你什么了?我是不懂你以为是什么,却拿出来进行你的推论,所以需要你告诉一下。 我再给你明确问一下,什么叫做“转换为IList”呢?你从哪里看来的“转换”概念呢?你所理解的“转换”根本就是“指鹿为马”那种转换,而不是所谓的“向上转换 IList 类型”所说的转换!
threenewbee 2014-10-09
  • 打赏
  • 举报
回复
C#为什么要有类型的概念,就是为了在编译时期做类型检查。 比如 dlg.Show(); 因为dlg是Form类型,有Show方法,就可以通过编译。 obj.Show(); 因为obj是object类型,没有Show方法,就不能编译。 现在我们需要一个类型,既不是具体的类型(比如Form),又表示它存在一个Show();方法,怎么办? 那就定义一个接口。
finemi 2014-10-09
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
[quote=引用 楼主 finemi 的回复:] 另外他可以让实现了他的类向上转型实现多态,但是我想一般不会转换为接口吧? 比如IList接口的作用
什么叫“向上转型”?你从哪里看到这个概念,给出链接,看看你看的是什么?! 总的来说,你满脑子只有“has-a”,没有“is-a”概念。让你理解接口、继承、多态、“向上转型”确实有些困难。但是我觉得你给最主要是不要仅凭瞎猜而“死读书”,先不要有成见,尽量先把概念落地,慢慢就好了。[/quote] 不要吓我。。向上转型,向下转型这个概念没问题吧。一个名词而已呀
finemi 2014-10-09
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
接口约束了什么要搞清楚,接口约束了实现它的类必须实现它所规定的方法。 编译器不允许你缺少这些方法而编译代码。 因此当你调用具有某个接口的类的时候,就可以放心调用这些方法——它们肯定存在。 因此最终的目的就达到了——我们可以用接口类型代替具体类型,作为变量、函数的参数、返回值等等。 这样做的好处显而易见,大家都认接口,而不是具体的类型,比如一个函数的参数,是接口,那么调用者就不必拘泥于传递特定的类型,只要实现这个接口的都可以,甚至是他自己写的类型,他就可以实现自己的代码并且注入到函数调用中。
哦,意思是主要还是着落在多态上? 只不过不像子父类继承那样仅限于子父类之间?
finemi 2014-10-09
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
[quote=引用 楼主 finemi 的回复:] 另外他可以让实现了他的类向上转型实现多态,但是我想一般不会转换为接口吧? 比如IList接口的作用
什么叫“向上转型”?你从哪里看到这个概念,给出链接,看看你看的是什么?! 总的来说,你满脑子只有“has-a”,没有“is-a”概念。让你理解接口、继承、多态、“向上转型”确实有些困难。但是我觉得你给最主要是不要仅凭瞎猜而“死读书”,先不要有成见,尽量先把概念落地,慢慢就好了。[/quote] 这不算死读书吧,我这就是在搞清除概念,我觉得编程理论概念这东西比实际操作更重要,实际操作是建立在理论知识上的。自己亲身体会,当对于一个知识理论掌握得不够深的时候,要去实现相关的功能特别困难,反之特别轻松
threenewbee 2014-10-09
  • 打赏
  • 举报
回复
接口约束了什么要搞清楚,接口约束了实现它的类必须实现它所规定的方法。 编译器不允许你缺少这些方法而编译代码。 因此当你调用具有某个接口的类的时候,就可以放心调用这些方法——它们肯定存在。 因此最终的目的就达到了——我们可以用接口类型代替具体类型,作为变量、函数的参数、返回值等等。 这样做的好处显而易见,大家都认接口,而不是具体的类型,比如一个函数的参数,是接口,那么调用者就不必拘泥于传递特定的类型,只要实现这个接口的都可以,甚至是他自己写的类型,他就可以实现自己的代码并且注入到函数调用中。
finemi 2014-10-09
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
[quote=引用 楼主 finemi 的回复:] interface是一种约定,或者标准,约束实现了他的类所具备的方法,弥补了单继承的“缺陷”。从设计理念上讲,同abstract class比较,interface用于has a,abstract class用于is a,他们都可以通过转型来实现多态。 这些道理我都懂,
瞎说。 interface 和 abstract class 都是说“is-a”关系的,谁告诉你的“has-a”?给出链接来,我们踩死写那种文章的人![/quote] 书上看到的... interface是is a 么。 按照我的理解确实has a还是很贴切的呀。比如:基类Door,一个Open()和一个Close()方法,然后一个Alarm接口,具备一个Alarm()方法。 最后子类AlarmDoor继承自Door,实现Alarm接口。 因为AlarmDoor不是Alarm,而是Door,则AlarmDoor is Door,AlarmDoor has Alarm。
  • 打赏
  • 举报
回复
引用 楼主 finemi 的回复:
另外他可以让实现了他的类向上转型实现多态,但是我想一般不会转换为接口吧? 比如IList接口的作用
什么叫“向上转型”?你从哪里看到这个概念,给出链接,看看你看的是什么?! 总的来说,你满脑子只有“has-a”,没有“is-a”概念。让你理解接口、继承、多态、“向上转型”确实有些困难。但是我觉得你给最主要是不要仅凭瞎猜而“死读书”,先不要有成见,尽量先把概念落地,慢慢就好了。
  • 打赏
  • 举报
回复
引用 楼主 finemi 的回复:
interface是一种约定,或者标准,约束实现了他的类所具备的方法,弥补了单继承的“缺陷”。从设计理念上讲,同abstract class比较,interface用于has a,abstract class用于is a,他们都可以通过转型来实现多态。 这些道理我都懂,
瞎说。 interface 和 abstract class 都是说“is-a”关系的,谁告诉你的“has-a”?给出链接来,我们踩死写那种文章的人!
全栈极简 2014-10-09
  • 打赏
  • 举报
回复
当开发一个大型项目的时候,这些接口、规范就显得很重要。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧