首页 新闻 会员 周边

关于JAVA interface 的多继承

0
[已解决问题] 解决于 2013-12-18 17:22

本人新手,问题用代码来描述吧,先定义两个interface,这两个interface具有相同签名的方法,如下

interface InterfaceA

{

  void Say();

}

 

interface InterfaceB

{

  void Say();

}

 

然后用一个类来实现这两个接口

public class Drived implements InterfaceA, InterfaceB

{

  public void Say(){System.out.println("Hello.");}

}

 

上述代码在.net中,会报一个编译时错误的,必须要显式的来实现InterfaceA.Say()和 InterfaceB.Say()。但是java是可以这样写的,这样问题就来了,在JAVA中该如何区分Drived.Say() 是实现了 InterfaceA的呢,还是实现了 InterfaceB 的呢?

 

如下的客户端代码:

InterfaceA a = new Drived();

a.Say();

 

InterfaceB b = new Drived();

b.Say();

 

二者的输出都是 Hello. 请问我该如何做才能让 a.Say() 和 b.Say()的实现是不同的呢?

Super猪的主页 Super猪 | 菜鸟二级 | 园豆:202
提问于:2013-12-18 10:46
< >
分享
最佳答案
1

两个不同的接口中有同一个方法,你要做什么?

奖励园豆:5
angelshelter | 大侠五级 |园豆:9887 | 2013-12-18 11:54

要想实现不同,一个是创建不同的子类,一个是用匿名类。

angelshelter | 园豆:9887 (大侠五级) | 2013-12-18 11:55

@angelshelter: 请把我的目的理解成:一个类实现了两个不同的接口,恰巧这两个接口里面定义了签名相同的方法

Super猪 | 园豆:202 (菜鸟二级) | 2013-12-18 12:59

@Super猪:不会报错? 

angelshelter | 园豆:9887 (大侠五级) | 2013-12-18 14:25

@angelshelter: 不会报错。在.net 中,必须显式的实现接口方法,例如

public class A : InterfaceA, InterfaceB

{

  void InterfaceA.Say()

  {

    Console.WriteLine("I'm A.");

  }

 

  void InterfaceB.Say()

  {

    Console.WriteLine("I'm B.");

  }

}

 

这样客户端调用是这样的  

InterfaceA a = new A();

InterfaceB b = new A();

 

a.Say();  //输出 I'm A.

b.Say();  //输出 I'm B.

 

但是在JAVA中,貌似是没办法这样子实现的

Super猪 | 园豆:202 (菜鸟二级) | 2013-12-18 14:31

@Super猪:其实也没必要,在java中,那两个接口本变就是空的,最终是看实现。一般的理解,如果方法是一样的,要么是继承,要么是覆盖。意思就一个,确定性。 

angelshelter | 园豆:9887 (大侠五级) | 2013-12-18 17:16

@angelshelter: 嗯,明白了。这两天在看JAVA,看的过程中跟.NET对比,本来以为二者的设计是一样的,现在看来还是有区别的,呵呵。

Super猪 | 园豆:202 (菜鸟二级) | 2013-12-18 17:21

@angelshelter: 结贴喽

Super猪 | 园豆:202 (菜鸟二级) | 2013-12-18 17:21
其他回答(1)
1

建议你参考一下:http://bbs.csdn.net/topics/330161338

里面的建议应该对你很有帮助。

 

你给的例子中Say()的实现 既是A的,也是B的

bitbug | 园豆:470 (菜鸟二级) | 2013-12-18 11:10

嗯,谢谢,看来JAVA跟.NET 在这一块是有区别的

支持(0) 反对(0) Super猪 | 园豆:202 (菜鸟二级) | 2013-12-18 13:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册