本人新手,问题用代码来描述吧,先定义两个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()的实现是不同的呢?
两个不同的接口中有同一个方法,你要做什么?
要想实现不同,一个是创建不同的子类,一个是用匿名类。
@angelshelter: 请把我的目的理解成:一个类实现了两个不同的接口,恰巧这两个接口里面定义了签名相同的方法
@Super猪:不会报错?
@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猪:其实也没必要,在java中,那两个接口本变就是空的,最终是看实现。一般的理解,如果方法是一样的,要么是继承,要么是覆盖。意思就一个,确定性。
@angelshelter: 嗯,明白了。这两天在看JAVA,看的过程中跟.NET对比,本来以为二者的设计是一样的,现在看来还是有区别的,呵呵。
@angelshelter: 结贴喽
嗯,谢谢,看来JAVA跟.NET 在这一块是有区别的