接口2:接口与多重继承(csdn的讨论)

来源:互联网 发布:zip解压命令 linux 编辑:程序博客网 时间:2024/05/22 14:16
主  题:
【150分大讨论】为什么要使用接口?
作  者:zhaoqiubo (小熊杰利米)
信 誉 值:100
所属论坛:Java 设计模式
问题点数:150
回复次数:45
发表时间:2004-10-20 14:47:59
我对接口的利于扩展还有所理解,但是多重继承就有些疑问了。。。大家知道,接口中的方法是没有实现细节的.只不过就是一个名字.虽然它可以帮助我们实现多重继承,可是它没有方法的细节,也就是根本就没有实现方法.纵使我们实现了多重继承,又有什么用处呢??难道只是为了继承一个方法的名字吗???这样有意义吗?我还是要编写实现的过程啊.就算不使用接口,不实现多重继承,那也一样是写实现的过程啊,反而不用写接口减少的代码量啊!!不明白....请高手指教.最好举例说明,说明出如果有接口会怎么样?如果没有接口又是什么样子?为什么有接口才好....
回复人: yz790724(想想) ( ) 信誉:78 2004-10-20 14:52:20 得分:0
 
没有继承代码,但是继承了特征。
Top
回复人: j2nix(八月清秋) ( ) 信誉:100 2004-10-20 14:55:35 得分:20
 
举个例子:门Door(父类)---> 防盗门Alert Door(子类),具有防盗功能(接口)门Door(父类)---> 木头脑门Wooden Door(子类)防盗功能除了在门上,在其它东西上也可能有。所以说,抽象类与接口的区别从概念上讲是对事物的侧重点不同而已。
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-20 15:00:47 得分:0
 
引用:门Door(父类)---> 防盗门Alert Door(子类),具有防盗功能(接口)门Door(父类)---> 木头脑门Wooden Door(子类)防盗功能除了在门上,在其它东西上也可能有。我管它其他东西上有没有,反正接口没有实现过程,每个不都得自己写实现过程嘛。我还要这个防盗功能的接口干什么???这样的话,我不用接口反而减少了代码量呢。。另:我没有问抽象类。。。
Top
回复人: haozhangpk(步惊云) ( ) 信誉:100 2004-10-20 15:01:27 得分:10
 
其实用接口就是统一一个标准,具体类里的实现可能不同但对外的名字都是相同的。你看一下Collection这个接口与其它子孙的实现关系我想你就明白了对了还有一点,如果用接口那它一定是工具类,是被客户类所调用的类
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-20 15:01:40 得分:0
 
引用::yz790724(想想) 没有继承代码,但是继承了特征。你恐怕搞错了,接口继承的主要是行为。
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-20 15:03:42 得分:0
 
接口就是统一一个标准好,这个算一点。。可是这点理由不够充分的让我们使用接口吧。。是不是还有其他更重要的原因,让我们利用接口实现多重继承。。
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-20 15:07:31 得分:0
 
to haozhangpk(步惊云) :能给我详细解释一下,这句话吗?对了还有一点,如果用接口那它一定是工具类,是被客户类所调用的类
Top
回复人: caiyi0903(willpower) ( ) 信誉:100 2004-10-20 15:34:33 得分:10
 
接口完全是根据设计的思路来制作的。通常都是通用的方法,在具体类里需要实现它们。因为有的类既需要实现这些公用的方法,又需要继承一个粗象的类,所以才会用接口来实现多重继承。楼上的那个例子列举得很好:)
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-20 15:42:42 得分:0
 
to caiyi0903(willpower) 你恐怕没有看清楚我问的问题,我即没有问接口是什么?也没有问在何种地方使用它,我是问为什么使用它,使用它有什么好处,使用它和不使用它的区别?
Top
回复人: wwwer1(武陵豪杰) ( ) 信誉:100 2004-10-20 16:50:30 得分:0
 
没有接口很难实现松散耦合。我觉得这是j2ee项目之所以成功的关键。没有接口就没有那么多人去钻研java了。不用举什么例子,看看自己做过的项目就知道了拿一个普通的中小项目来说,如果把接口部分用其他的方法实现,要多大的工作量。如果你说不需要修改或者改动很小的话,那么你想一下你的系统要扩展需要多大的工作量。
Top
回复人: helldream2002() ( ) 信誉:100 2004-10-20 16:55:26 得分:0
 
当然是接口好用嘛
Top
回复人: iwenlong(贪吃龙) ( ) 信誉:100 2004-10-20 16:56:38 得分:0
 
推荐你看java设计模式,用java实现那些模式,接口是必须的,这在小程序时是不容易看出来的,项目做大了就体现出模式的重要了
Top
回复人: tigeryu(吴越小虎) ( ) 信誉:97 2004-10-20 17:02:00 得分:10
 
interface顾名思义,主要用来规范实现的对外接口。这样你写完了一个程序发现使用的这套接口实现效率极差,你完全可以用另一套来替换掉,所做的只是改一个工作类的调用,否则的话,你就去拼命改代码吧。最典型的就是jdbc了,你换了一种数据库,那你调用jdbc的代码是不用改动的,要改的只是register一个新的驱动类就行了
Top
回复人: yz790724(想想) ( ) 信誉:78 2004-10-20 17:02:06 得分:0
 
引用:我管它其他东西上有没有,反正接口没有实现过程,每个不都得自己写实现过程嘛。我还要这个防盗功能的接口干什么???这样的话,我不用接口反而减少了代码量呢。。============================================================你没用,但别人有用。你有没有用过运行时绑定呀?在哪里,你哪个防盗功能的接口对编代码就有用。
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-20 17:13:18 得分:0
 
我知道它很有用,就光扩展性而言,我能举出例子来,也能说出为什么。我问的是用它实现多重继承有什么好处,如果不用又是一个什么样子?可是你们都人云亦云,说不出好的道理来。。大家讨论嘛。。有用也 不是说有用就有用的呀,请举例子啊。看看态度。。看看。。。啥叫“就有用”啊。这不强词夺理嘛。。看看人家to tigeryu(吴越小虎) 说的多好。
Top
回复人: weimenren(宁静以致远,淡泊以明志) ( ) 信誉:152 2004-10-21 1:39:12 得分:15
 
看接口不能静态的看它1、接口可以封装底层实现的变化你知道Line, Circle 都是Shape,而在Shape这个接口中,你定义了所有你需要的操作,这样你就可以不管Shape是Line,还是Circle,而只需要他是Shape,就可以操作了这样对客户端就封装了底层实现的变化2、接口有利于系统的扩展同样是上面的例子,因为对客户端,你开放的只是 Shape的接口,当你的Shape有增加或变化的时间,你不需要通知客户端在OO的设计中重要的一条就是对接口编程而不是对实现编程因为有了接口才有了多态有了多态才有了灵活的动态绑定。其实可以这么说:有了接口(抽象)才有了OO
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-21 8:37:45 得分:0
 
上面说的好,但是你说的我都懂。这些我也能说出来。请仔细看我的问题好吗?我问的是多重继承。。
Top
回复人: zhangjyr(Tianium) ( ) 信誉:100 2004-10-21 9:15:24 得分:10
 
楼主拘泥于多重继承其实还是没有理解java的设计思想:java的设计原则是既为程序员所熟悉(所以它采用了C/C++的语法)又要避免语言太过复杂所导致的错误(如C++中有名的内存泄漏以及多重继承,对于多重继承,如果两个父类中有相同的方法,会导致编译错误)。所以java采用了Interface的概念来用另一种方式实现多重继承,Java中引入Interface一开始与其说是基于前面大家大说特说的各种优点的考量,不如说是为了避免C++多重继承所导致的问题而采用的一种变通。(不要误会,开发这一开始应该也是有使系统设计在逻辑上更简洁的考虑的)所以我觉得楼主明白的其中原委就应该没有必要拘泥于使用多重继承或者Interface了。
Top
回复人: flyforlove(为情飞) ( ) 信誉:103 2004-10-21 9:23:56 得分:20
 
这个问题以前讨论过,在我看来接口的作用绝不是为了多重继承,接口是一个标准,是为了减小模块之间的耦合。举个简单的例子,多人之间协作工作编写不同模块,如果事先把接口都定义好,至于谁来实现接口,谁来使用接口就变得不那么重要了,只要按照接口的定义,自己做自己的事情就好了。
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-21 11:12:43 得分:0
 
多重继承,我现在能理解到的程度就是提供了多个标准,和实现了面向对象的思想。。至于别的。。我理解不到。。。请各路高手指点。
Top
回复人: zzLove(烦) ( ) 信誉:100 2004-10-21 11:21:05 得分:0
 
旁听
Top
回复人: kaizaixian(kaizaixian) ( ) 信誉:98 2004-10-21 13:17:18 得分:5
 
接口 可以实现多重继承。我和楼主一样,不理解接口如何很好的实现多重继承的?。但我认为接口是用来定义一些规范的。来限制要使用该组件的对象的。这和 flyforlove(为情飞) 有些相似的。也许接口对于多重继承的实现来说并不理想化,但这只是他的一个功能,为了逼免出现象C++的缺点而使之实现起来并不理想的。(个人拙见)
Top
回复人: joudor(飞翔鸟) ( ) 信誉:100 2004-10-21 13:31:07 得分:5
 
呵呵,我给你举一个工作上的实例:    需要做一个树向上汇总组件,也就是说二次开发人员利用这个组件就可以实现按树结构来汇总数据。但对于我来说,并不知道树结构是什么样的,也不知道要具体汇总那些数据中的那些内容,更不知道要如何汇总。如果没有接口的话,这样的汇总组件就没法做了,因为你现在什么具体的内容都不知道,而只知道结构。
Top
回复人: joudor(飞翔鸟) ( ) 信誉:100 2004-10-21 13:42:46 得分:10
 
不好意思,刚才点错按钮了,现在发全!    呵呵,我给你举一个工作上的实例:    需要做一个树向上汇总组件,也就是说二次开发人员利用这个组件就可以实现按树结构来汇总数据。但对于我来说,并不知道树结构是什么样的,也不知道要具体汇总那些数据中的那些内容,更不知道要如何汇总。    1、如果没有接口的话,这样的汇总组件就没法做了,因为你现在什么具体的内容都不知道,而只知道可以利用树结构来汇。    2、众所周知,树结构分为编码树和主键树,如果没有多重接口继承的话,就得对这2种结构分别做组件了。而有了多重继承的接口,这个问题就好办了。    具体做法:    定义一个基本汇总接口作为父类,再定义2个接口继承之:一个编码树汇总接口,一个主键树汇总接口。然后你就认为基本汇总接口就是你要的细目,里面有日后用户实现的树结构,汇总的数据、类型、内容,汇总方法等等,你就可以编写汇总组件了。    当二次开发人员需要调用这个组件时,只要根据自己的树结构是编码树,还是主键树,实现一个接口,然后再调用汇总组件就可以了。    看过这个例子,你该就明白了吧。当然了,这个例子只是最基本的多重接口继承的例子,最多的还在EJB中,慢慢领会吧,祝你早日成功!
Top
回复人: zhangjyr(Tianium) ( ) 信誉:100 2004-10-21 13:45:10 得分:10
 
为什么非要把多重继承和接口对立起来呢,他们只不过是语言提供的机能,重要的是如何利用这些机能去架构一个系统。我们目前看重的是逻辑上的接口与实现的剥离。如果从这一点上说,java的interface和c++的多重继承同样可以达到目的,但C++做得不彻底,他仍允许人们在接口中加入实现,这就使楼主疑惑这样是否有他的好处,其实这个问题根本不是问题,任何做法都有好处或者坏处(写汇编或C时有很多很极端的trick以提高效率,以目前的眼光看可能认为这些是对编程规范的破坏,但从编写者的角度看,这正是精华所在),关键在于作者的想要达到目的,如果是要遵从接口与实现剥离这一原则,那在用C++这样允许多重继承的语言中完全可以不考虑多重继承的其他特性。那如果楼主觉得多重继承这样从多个类继承实现的特性很好,那java中的确没有与之完全对应的特性,但仍可以用Adapter这样的设计模式将多个类的特性集成到一个类中。
Top
回复人: soyol() ( ) 信誉:100 2004-10-21 14:46:48 得分:0
 
举个例子:门Door(父类)---> 防盗门Alert Door(子类),具有防盗功能(接口)门Door(父类)---> 木头脑门Wooden Door(子类)防盗功能除了在门上,在其它东西上也可能有。对于接口,更注重的是实现了一种行为,有了某种处理能力对于继承,更注重于说明事物之间的亲缘关系.在实现上,支持多重继承的语言中的抽象类也可以实现接口功能.但是从理解本身讲,用接口更利于描述行为特性.例:项目中有各种各样的类,可是有些类是需要权限才可以使用的.这些类就实现了一个“校验权限”的接口.我们也可以定义"校验权限类"这样一个抽象类,然后继承使用,但是别扭。接口才是最贴切的描述.实现同一接口的不同类,它们相互之间可以是毫不相关的继承自同一父类的不同子类,它们就是兄弟姊妹了
Top
回复人: weimenren(宁静以致远,淡泊以明志) ( ) 信誉:152 2004-10-21 18:58:49 得分:20
 
不好意思,一开始回答问题没有仔细看底下的描述我就多重继承先来一个例子interface Animalinterface LandAnimal extends Animal{    public void jump();}interface WaterAnimal extends Animal{    public void swim();}那你说 frog 怎么定义下去?frog 可以跳也可以游泳,这个时间也就需要多重继承了class Frog implments WaterAnimal, LandAnimal {}但是由于client 定义的时间,我使用的 animal定义的,我需要分别根据 waterAnimal和landAnimal来知道 client使用的对象可以做什么因为这样有助于实现多态最后我需要((WaterAnimal)animal).swim();((LandAnimal)animal).jump();也最后在client我知道有一种动物可以跳也可以游泳不管如何 继承接口还是要求继承接口的这种抽象,以方便面向接口编程,降低对象的耦合
Top
回复人: lstkkk(牛虻) ( ) 信誉:100 2004-10-22 6:22:16 得分:0
 
旁听
Top
回复人: jiganghao(JH) ( ) 信誉:109 2004-10-22 7:13:48 得分:0
 
interface can be used to cope with the problems of multi inheritance in C++.In C++, you only have class supporting multi inheritance.  the algorithm to decide which super class to inherit a method is complicated. you might need draw a hierarchy graph to find a class's nearest common super class.  it is a pain when you traverse through tree of super classes.in Java, single inheritance enables one direction code reuse.  it seems 'less' powerful.  but coding is much simpler and easier to understand.  In OO's view, inheritance is good for code reuse, but a big class hierarchy is very difficult to maintain and extend.An alternative of inheritance is composition.  it is more flexible, and take much burden from inheritance.  In OO, inheritance is a strict 'IS-A' relation.  It must satisfy the substitution principle. Make your class hierarchy a pure 'IS-A' relation; anything else should use composition.
Top
回复人: jiganghao(JH) ( ) 信誉:109 2004-10-22 7:24:16 得分:0
 
interface is a typical mechanism for composition.  In java, class is not the preferrable way to define a type, interface is.when you have behavior from more than 1 classes to reuse, instead of multi inheritance in C++, define 2 interfaces, each defines the set of behaviors you want.  In Java, a class can implements more than 1 interface.  An examplar case: classAB wanna reuse behavior defined in classA and classB. Define 2 interfaces: interfaceA implemented by ClassA, interfaceB implemented by classB. Make classAB implements both interfaceA and interfaceB.  Make classAB containing 2 members: instanceA of type interfaceA, instanceB of interfaceB.  For methods defined in interfaceA, delegate the method calls to instanceA.  Here we replace clas inheritance with composition supported by interface.Do ask me why componsition is better than inheritance.  Ask your professor who teaches software engineering or OO.
Top
回复人: jiganghao(JH) ( ) 信誉:109 2004-10-22 7:29:06 得分:0
 
i mean do NOT ask me question about inheritance and composition.
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-22 10:46:04 得分:0
 
In java, class is not the preferrable way to define a type, interface is.For methods defined in interfaceA, delegate the method calls to instanceA. Here we replace class inheritance with composition supported by interface.这两句是什么意思,我不大懂,能说一下嘛?例子举的我没有明白...能说一下嘛..
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-22 14:51:49 得分:0
 
谁有时间帮我翻译翻译呀..
Top
回复人: weimenren(宁静以致远,淡泊以明志) ( ) 信誉:152 2004-10-22 19:32:28 得分:5
 
在java中,interface是定义一种类型的首选而不是class一个方法定义在 interface A,在实例A中调用方法,这里用interface的组合替代了class的继承
Top
回复人: jiganghao(JH) ( ) 信誉:109 2004-10-23 2:22:41 得分:0
 
thx weimenren.
Top
回复人: alaal(~:寒~:冬:~) ( ) 信誉:118 2004-10-23 11:09:34 得分:0
 
to  zhaoqiubo(小熊杰利米) :就是说类并不适合于定义一个类型,这个工作应该由接口来承担。为什么这样说呢,我在我的帖子里有这方面的论述:http://community.csdn.net/Expert/topic/3451/3451842.xml?temp=8.807009E-02
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-25 9:19:45 得分:0
 
这个说英文的家伙,回答了半天还是说的接口和类。。可是我问的是多重继承。。。
Top
回复人: victorylj(cherry) ( ) 信誉:100 2004-10-25 9:33:44 得分:0
 
我也想知道,关注ing
Top
回复人: blackcourser(be stronger……) ( ) 信誉:97 2004-10-25 16:22:04 得分:0
 
学习
Top
回复人: jeanven() ( ) 信誉:98 2004-10-25 19:53:42 得分:0
 
java 本身不支持一个类同时继承多个类,如果想实现多个类的功能则可以通过实现接口来实现。
Top
回复人: xiaoyaozhifeng(逍遥之风) ( ) 信誉:100 2004-10-25 20:28:29 得分:0
 
努力学习中,看了以后对接口有了更深入的了解,谢谢
Top
回复人: cocolovevienna(狂徒再世) ( ) 信誉:94 2004-10-25 20:38:05 得分:0
 
weimenren(宁静以致远,淡泊以明志)这位兄弟的回答可以回答多重继承在人类的思维逻辑上的体现。
Top
回复人: UglyUgly(丑丑) ( ) 信誉:100 2004-10-26 9:33:41 得分:0
 
《设计模式》中第一章就说“要针对接口编程”好好看一下设计模式你就知道为什么要接口。我认为 《设计模式》中的接口是指纯的抽象类和接口类。多重继承不好的一点是会出现某个接口有多个实现的情况,所以才会有接口这个东西。
Top
回复人: zrhk(一清二白) ( ) 信誉:88 2004-10-26 10:16:40 得分:0
 
接口有很多好处:1.是为了隐藏子类,起到封装的作用.2.接口使得我们可以构造出非层次结构的类型框架3.可以安全地增强一个类的功能:如包装类4.java中可以通过接口来实现多重继承等等...
Top
回复人: zhaoqiubo(小熊杰利米) ( ) 信誉:100 2004-10-27 13:18:00 得分:0
 
结贴。。到了最后也没有人明确的能说出多重继承的好处。我估计也就是定义了多个标准和符合面相对象思想吧。。。