我认为java的接口也是为了实现多继承的不得已,当然没有c++中的理所当然来的顺利。

解决方案 »

  1.   

    interface 活动{
       跑();
       跳();
    }interface 恐怖{
       吃人();
    }class 狼 implement 活动,恐怖{
       跑();
       跳();
       吃人();
    }而对于猫,它不恐怖的。
    class 猫 implement 活动{
       跑();
       跳();
    }
      

  2.   

    to: totodo(土豆仙)
    经典
      

  3.   

    totodo(土豆仙) 是为了让你清楚地看到接口的好处用接口怎样实现不同的类具有相同的操作,即统一的界面同时又有不同的操作
      

  4.   

    呵呵~~~
    如果没有学过c++也就没有这个问题了 ^_^因为每一个class中都要占用存储空间来存放实现细节
    如果实现多继承,在合并的时候好像编译器会有不少负担而interface与实现细节无关也许这是java只有多实现,没有多继承的一个考虑方面吧 ^_^
      

  5.   

    不过在使用上
    我最近也在考虑楼主所提出的问题
    就是我希望能够合并多个实现细节
    不知道在java中是如何来实现的 ^_^
      

  6.   

    (inherit是可以inherit class 也可以inherit interface的。你可能只把继承理解为extands。
      

  7.   

    totodo(土豆仙)写得我明白,我也知道这是接口的一个优点,
    但是这对我的问题没有帮助,我只是对“接口实现多重继承”这句话的意思有些疑惑。to danceflash(Wine)
    其实这个学不学c++没有什么关系,多重继承的一个好处(至少我认为是个好处)就是
    可以继承几个实现类,而不用考虑这几个类是谁写的,还有哪部分程序在用它,但是
    接口并没有给java带来这个好处,因为当初设计这几个类的时候,不会想到会有谁去
    继承它,所以可能并没有用接口来描述。还有对于合并多个实现细节,我想可以用内部类来模拟,但这绝对不是多重继承。
      

  8.   

    to  totodo(土豆仙) 
    你误会我的意思了,你说得我明白,类和接口都可以继承。
    我只是说对实现类的多重继承。搜以下以前的帖子,好多人都说接口带了的一个好处就是实现多重继承。
    就连think in java里也这么说,我实在不明白既然不能从多个实现类里继承
    这样的多重继承有什么好处。
      

  9.   

    java只有单继承和多实现,这一点上确实没有什么好争论的 ^_^
    我想那句话只是说明在java中使用接口来实现多重继承的问题,这里我觉得它所说得多重继承是在向上转型中用到的 ^_^如果使用内部类的话好像感觉上没有这个需求,我还是考虑使用组合吧 ^_^至于好处,我觉得确实对比着C++和java一起学习,可以了解两种语言的差别,并看到他们的不同的着眼点,每一门计算机语言都是在现有技术上寻求一个平衡点,而java寻求自己的平衡点时放弃了多继承别人跟我说有书曾说到过一些java语言为什么选择这样一些特性的原因,不过我还没有看到过,不知道哪位高手能推荐一些这方面的书 ^_^
      

  10.   

    totodo(土豆仙) 写的已经足够说明问题了。
    java接口的好处我是在使用java一年以后才发现的。
    看书真的看不明白的。
      

  11.   

    to danceflash(Wine)
       确实是,其实如果没有那句话的话,我也不会有这样的疑问,就是因为有了那样一句话,
    我才会和c++进行类比的,其实接口有它自己的好处,没有必要和多重继承掺和在一块。to futurebus(老猫) 
       对于接口的好处,我虽然不能从工作中体现,但是我已经有感性的认识了,他写的例子,
    我明白,但是和我的问题没有关系,我并没有问“为什么要用接口”或者“接口有什么好处”
    我的疑问还是这个帖子的标题。
      

  12.   

    其实楼上各位都只是在语法的层面上看这个问题
    实际上,在绝大多数情况下你都不会真的需要继承多个类
    如果一个对象既是A又是B又是C而ABC本身又是相互独立的
    这本身就不符合一般的逻辑,说明你在建模和设计类结构时出了问题
    多继承99%的用途是为了实现多接口,
    我记得我的老师跟我说,永远不应该同时继承多个实体类
    但同时继承一个实体类和多个接口或抽象类却是有必要的
    JAVA与C++相比在这方面最大的缺点是不能多继承抽象类
    因为我们常常不满足于只继承接口本身,
    而是希望在接口中加入一些实现这个接口所需的公共的基础的支持
    JAVA在这个方面的确有些缺陷,
    但你确实可以用proxy、adapter、bridge之类的pattern
    或者调整类结构(比如composite pattern)来解决这个问题
      

  13.   

    flyforlove(为情飞) 
    这句话,从字面上理解确实是容易误导人。但是知道,java没有多重继承之后,再看接口可以实现多重继承,就明白多了。。C++中所说的接口也不是java中那个interface一样啊。语言嘛,思想上差不多。。不过语言上要全部忘记其他的,可能是受C++的影响吧。
      

  14.   

    to  DaNiao(鸿雁)
    说的有一定道理,但是并不能说明问题,继承的好处我觉得一个就是代码重用,
    打个比方一个类是实现踢足球,一个类是实现打篮球,这两个类都是已经实现了的,
    分别用于会踢足球和会打篮球的人,我只是想拿过来用,
    因为我要应用的这个人两个都会,所以我想都用,但是当初设计的时候没有考虑到会有人
    要继承这些类,所以从开始设计的时候就没有考虑到先在接口定义,然后实现。
    这样的话,我就没有办法用这些写好的代码,多重继承实体类,这算不算是一个好处?还有,你说“JAVA与C++相比在这方面最大的缺点是不能多继承抽象类”
    如果java可以继承抽象类的话,也就没有这么多问题了,因为抽象类和接口的一个区别
    就是抽象类里可以实现。
      

  15.   

    如果说要实现多重继承,就必须在当初设计这三个类A,B,C的时候,就要先用接口
    定义,然后再实现,这样还有什么意义?也许这三个类我都不知道是谁写的
    我只是想拿过来用而已,总不能对这三个类再进行修改吧。再看接口可以实现多重继承   这没什么误导的  搂主说的这种情况 完全可以用聚合 免得继承乱用public class 活动{
       跑();
       跳();
    }public 恐怖{
       吃人();
    }class 狼 {
       恐怖 恐怖1 = new 恐怖();
       活动 活动1 = new 活动();
       跑();
       跳();
       吃人();
    }语言吗   解决问题的方案不一样    都能解决问题
      

  16.   

    to totodo(土豆仙) 嗯,我知道了,可能是我太钻牛角尖了,其实java里就没有多重继承,
    即便是引入了接口也没能实现c++中多重继承的功能。我记得ibm的开发网上有篇文章写着写程序第一条,尽量不要用继承,而是用合成,
    我想就是因为java里没有多重继承的缘故,因为当初设计的时候谁也不能预想到
    以后是否要继承这些类,所以不可能都用接口来定义。
      

  17.   

    to  jokerjava(冷血) 谢谢,我知道你说的这种实现方法,也叫合成,这和接口,多重继承没有关系,
    只是模拟了多重继承的功能。好了,谢谢各位,只要弄清楚这些,我看就差不多了,毕竟我还是初学者,
    现在在这方面钻牛角尖也没有什么意义了。
    再次感谢,明天来了揭帖。
      

  18.   

    其实楼上各位都只是在语法的层面上看这个问题
    实际上,在绝大多数情况下你都不会真的需要继承多个类
    如果一个对象既是A又是B又是C而ABC本身又是相互独立的
    这本身就不符合一般的逻辑,说明你在建模和设计类结构时出了问题
    多继承99%的用途是为了实现多接口,
    我记得我的老师跟我说,永远不应该同时继承多个实体类
    但同时继承一个实体类和多个接口或抽象类却是有必要的
    ----------------------------------------------------
    同意以上我想说的是:
      Interface,  多重继承,  对象组合都是编程的利器。Interface: JAVA的创造者想必功力深厚,专门用一个关键字来说明接口的重要性,不用可就..,同样只让Interface能多重继承,说明了Interface多重继承的好处,和多重继承的好处。对象组合大家都说好,是很好,它很灵活,可在运行期动态绑定。但是它要new,还得看看是不是NULL吧多重继承是在编译时绑定,它的好处说白了就是不用new,而且比对象组合调用少了一层间指,所以也很有用。ATL比MFC强得多,它使用了多重继承和模板来实现,威力无比啊.总而言之,多多用这些东西操练操练,有比没有强。
      

  19.   

    我觉得这是中文书的说法,在我看的java英文原版书里不是这个意思。