黑马程序员技术交流社区

标题: 单继承与多现实的例外? [打印本页]

作者: 陈汉维    时间: 2012-7-29 14:11
标题: 单继承与多现实的例外?
本帖最后由 陈汉维 于 2012-7-29 14:20 编辑
  1. interface A
  2. {
  3.     public abstract int show();
  4. }
  5. interface B
  6. {
  7.     public abstract double show();
  8. }
  9. abstract class C
  10. {
  11.     public static final int NUM = 3;
  12.     public abstract void show();
  13. }

  14. class D extends C implements A,B
  15. {
  16. public void show()
  17. {

  18. }

  19. public int show()
  20. {
  21.     return 0;
  22. }

  23. public double show()
  24. {
  25.     return 1.1;
  26. }
  27. }
复制代码
老毕在接口那章有说到一个类既可以单继承也可以多现实,那以上这个就无法单继承多实现,大家怎么认为的?

这算不算是一种单继承多现实,或多实现,或单继承单实现局限性?

作者: 张振纲    时间: 2012-7-29 14:28
没太明白你的意思,但是既然你要继承
那你第17行是要重写,还是要重新定义一个函数,没看懂
作者: 陈汉维    时间: 2012-7-29 14:31
张振纲 发表于 2012-7-29 14:28
没太明白你的意思,但是既然你要继承
那你第17行是要重写,还是要重新定义一个函数,没看懂 ...

第17行是覆盖类C中的show方法。但是接口A和B中都有show方法,只是返回值类型都不一样,这样就无法单继承多实现,不是吗?
作者: 丁二跃    时间: 2012-7-29 14:32
这个程序有问题……

继承抽象类要实现类里的 抽象方法,实现接口 要实现接口定义的方法……
你这里 抽像类 接口定义的 方法都是 show(),
理论上D应该都实现,那么 D 里应该有 void show()  , int show() , double show()
但是这是不行地, 如果你掉一个show() 方法,程序知道去执行哪个吗?

方法的重载不是看返回值,而是看参数的 类型与个数……


作者: 纪艺松    时间: 2012-7-29 14:34
个人觉得应该算是一种局限性,,在被整合到同一个类中的不同接口或者类中使用相同的方法名,会造成代码的混乱,我们要做的是不是就是避免这种情况呢??
作者: 乐峰    时间: 2012-7-29 14:34
应该改一下方法名字,继承抽象父类和实现多个接口,复写它们的抽象方法,但是复写之后就出现了多个方法相同的名字,但是还不符合重载的要求,方法名相同,但是参数个数,位置,类型都应该不同。所以你的程序必然出现错误。
作者: 包晗    时间: 2012-7-29 14:38
接口 能多继承
作者: 张振纲    时间: 2012-7-29 14:42
陈汉维 发表于 2012-7-29 14:31
第17行是覆盖类C中的show方法。但是接口A和B中都有show方法,只是返回值类型都不一样,这样就无法单继承 ...

覆盖要求子父函数一致,返回值也必须一致
作者: 张振纲    时间: 2012-7-29 14:43
我觉得你的思维里把重载和重写搞混了
作者: 陈汉维    时间: 2012-7-29 14:54
丁二跃 发表于 2012-7-29 14:32
这个程序有问题……

继承抽象类要实现类里的 抽象方法,实现接口 要实现接口定义的方法……

所以说,假设在进行二次开发,不能修改源代码,一般都是用继承或者实现的把?如果继承一个类,然后再实现一个接口。可是被继承的类和接口里面有同名的方法,返回值却不相同,那怎么办呢?那就只能继承该类,或者只能实现该接口,不是吗?
作者: 陈汉维    时间: 2012-7-29 14:56
聂峰 发表于 2012-7-29 14:34
应该改一下方法名字,继承抽象父类和实现多个接口,复写它们的抽象方法,但是复写之后就出现了多个方法相同 ...

所以说这样就无法单继承多实现,而且如果A接口中的方法是show1(),B接口中的方法是show2(),那多实现没问题吧,可是如果A和B接口中的方法名字都相同,但是返回值都不同,那不是无法多现实了啊。- -!汗
作者: 陈汉维    时间: 2012-7-29 14:57
张振纲 发表于 2012-7-29 14:43
我觉得你的思维里把重载和重写搞混了

好吧,我里面用的全都是覆盖,我可没用到重载。汗颜
作者: 陈汉维    时间: 2012-7-29 14:59
包晗 发表于 2012-7-29 14:38
接口 能多继承

interface A
{
    public abstract int run();
}
interface B
{
  public abstract double run();
}
class Test implements A,B
{
  
}
那如果是这种情况,可以多实现吗?- -!

作者: 陈汉维    时间: 2012-7-29 15:06
纪艺松 发表于 2012-7-29 14:34
个人觉得应该算是一种局限性,,在被整合到同一个类中的不同接口或者类中使用相同的方法名,会造成代码的混 ...

我也觉得写代码应该避免这种情况,如果出现这种情况,就无法多实现了不是吗。。。
作者: 纪艺松    时间: 2012-7-29 15:10
陈汉维 发表于 2012-7-29 15:06
我也觉得写代码应该避免这种情况,如果出现这种情况,就无法多实现了不是吗。。。 ...

我觉得这不是无法实现的问题,而是在一个类中不允许出现相同参数的同名方法。。不管是继承还是实现,这些方法都将被该类拥有。。不知道我说的对不对;
作者: 陈汉维    时间: 2012-7-29 15:20
纪艺松 发表于 2012-7-29 15:10
我觉得这不是无法实现的问题,而是在一个类中不允许出现相同参数的同名方法。。不管是继承还是实现,这些 ...

是的,一个类中不能出现同名的方法。所以这是一种例外不是吗?
作者: 刘同超    时间: 2012-7-29 15:28
OOP思想之继承。个人总结。
        (1)继承关系是传递的。若类C继承类B,类B继承类A,则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。
  (2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
  (3)继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
  (4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
  (5)提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这便是多重继承。Java出于安全性和可靠性的考虑,仅支持单重继承,而通过使用接口机制来实现多重继承。
        简而言之,父类有的子类必有,且子类还能有自己的属性和方法。


根据你所闻到的问题,能否参看第五条呢?
作者: 陈汉维    时间: 2012-7-29 15:39
刘同超 发表于 2012-7-29 15:28
OOP思想之继承。个人总结。
        (1)继承关系是传递的。若类C继承类B,类B继承类A,则类C既有从类B那 ...

多重继承是:
class A
{
  void show(){...}
}
class B extends A
{
  void show(){...}//A的show被覆盖了
}
class C extends B
{
  void show(){...}//B的show被覆盖了
}
- -!这个是多重继承。貌似和多现实是两码事
多实现是
interface A{void show();}
interface B{void show();}
class C implements A,B
{

}
作者: 王渠    时间: 2012-7-29 16:01
不会觉得多余???或是层次不对吗?
你去继承多个接口,接口中有相同的方法,是没有问题的。
但是你继承的类里面居然还有这个方法,那继承这些接口是否多余???
还是说层次错误了。
作者: 陈汉维    时间: 2012-7-29 16:04
王渠 发表于 2012-7-29 16:01
不会觉得多余???或是层次不对吗?
你去继承多个接口,接口中有相同的方法,是没有问题的。
但是你继承的 ...

interface A
{
  public abstract void show();
}
interface B
{
  public abstract int show();
}
class C implements A,B
{

}
这种情况是不是不能多实现?
作者: 王渠    时间: 2012-7-29 16:12
两个接口中的方法返回值是不一样的对吧,如果两个接口在做的是同一件事情。那就不需要两个接口,如果是不确定返回值。那是否可以用泛型???
或者直接返回值是Object类型,只要你在自己使用的时候把握好就ok?
作者: 陈汉维    时间: 2012-7-29 16:29
王渠 发表于 2012-7-29 16:12
两个接口中的方法返回值是不一样的对吧,如果两个接口在做的是同一件事情。那就不需要两个接口,如果是不确 ...

是的,所以说java有多实现,但是有些情况是用不了的不是吗
作者: 徐帅    时间: 2012-7-29 17:09
个人觉得是这样的,因为接口的目的就是定义了一个规则,接口是扩展的功能,在java中原本是以多实现来降低了多继承带来的隐患,就是当子类继承多个父类时,因为有共同的方法而不知道执行哪一个,楼主的问题,虽然用了多实现,却出现了同样的问题,原因就是对接口的理解不够深刻,定义时就出现了错误,既然接口是扩展的功能,而且对外提供了规则,那么它就应该有扩展性,在楼主的程序中毫无扩展性可言,都是特有方法,当其它类后期实现时不可能全部都会返回相同的类型,应该直接抽取共性的部分,定义为  public void show(),而且参数也没有区别,所以你又无法通过参数的类型来告诉虚拟机来执行哪个。这样的问题应该不是局限性吧,不过弄懂接口的定义我想这样的问题也不会出现了吧,
只是个人观点。希望对楼主有帮助。
作者: 陈汉维    时间: 2012-7-29 20:36
徐帅 发表于 2012-7-29 17:09
个人觉得是这样的,因为接口的目的就是定义了一个规则,接口是扩展的功能,在java中原本是以多实现来降低了 ...

非常感谢你的回答,确实是对接口理解不深刻。而且在以后写代码的时候定义方法名肯定要有意义的,所以我说的这种情况应该几乎不会出现。嘿,我举得这个例子只是非常特殊的情况,不是吗?
再次感谢,大家共勉,互相加油。:handshake
作者: 吴立杰    时间: 2012-7-29 21:27
哈哈,楼主有意思啊,这个跟单继承和多实现没关系咯,很明显啊,在第15行,class D extends C implements A,B这个类里面由于重写了三个同名同参的方法,导致这个类出问题了,这个在开发中是不会遇到的吧,楼主差点把我弄懵了,还好看出来了,楼主改下方法名,你的代码思路没错,错在重写后的方法无法重载了,哦了,这个问题应该给你分吧,楼主的思维角度很牛叉啊。
作者: 陈汉维    时间: 2012-7-29 21:43
吴立杰 发表于 2012-7-29 21:27
哈哈,楼主有意思啊,这个跟单继承和多实现没关系咯,很明显啊,在第15行,class D extends C implements A ...

我要的不是分,即使分拿到了,去了黑马不是也在听天书?而且13期距离现在还1个月多10天,我有必要花心思来骗分?还有,这个问题我也在CSND论坛也发过贴,只是现在大家都在看老毕的视频,所以才来给大家一个建议而已,不是吗?
再而,你们看的视频估计是老毕旧版的视频,老毕的旧版视频没讲到这个,但是老毕新版的视频讲到这个了。只是贴出来让大家看看而已,有多少人注意到了?请问这和我思维牛叉有关系吗?
interface A
{
  public abstract void add();
}
interface B
{
  public abstract int add();
}
class C implements A,B
{
  
}
请问这种情况你多实现?既然不能,那不就是一个例外?
有关于这个例子的出处,请查看传智播客官网,老毕最新版的视频(35天),第9天,第11(多实现)。谢谢,再而,你也很牛叉。
作者: 吴立杰    时间: 2012-7-29 22:11
陈汉维 发表于 2012-7-29 21:43
我要的不是分,即使分拿到了,去了黑马不是也在听天书?而且13期距离现在还1个月多10天,我有必要花心思 ...

:(我的言语刺激你了?
作者: 陈汉维    时间: 2012-7-29 22:16
吴立杰 发表于 2012-7-29 22:11
我的言语刺激你了?

哈哈,没有,你没经历过大家合作一起做一个项目,一起争执的场景吗?同样的道理。欧了。
还有,老毕第8天和第9天的继承和实现可以多看看,看了你就明白我说的这个问题和单继承多实现有木有关系了。另外,这个问题出处:老毕新版(35天)第9天第11个视频(多实现)。
作者: 吴立杰    时间: 2012-7-29 22:35
陈汉维 发表于 2012-7-29 22:16
哈哈,没有,你没经历过大家合作一起做一个项目,一起争执的场景吗?同样的道理。欧了。
还有,老毕第8天 ...

好了,哦了,我看看




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2