我有一个简单的Java问题。请考虑以下接口:
interface A {
void work();
void a();
}
interface B {
void work();
void b();
}
所以当一个类要实现它们时,它应该是这样的:
class Impl implements A, B {
void work() {
/*some business*/
}
void a() {}
void b() {}
}
我的问题是,在work
方法中,我如何找到它,它是由类型A
或B
调用的?
C#中的上述类就像这样,这很好地区分了两个实现:
class Impl : A, B
{
void B::work() {}
void A::work() {}
void a() {}
void b() {}
}
但是我如何在Java中实现类似C#模型的东西?!
提前致谢。
答案 0 :(得分:6)
都不是。 interface
的概念是实现它的类,与接口所暗示的“契约”一致。如果你有两个接口,要求实现方法work()
和实现两个接口的类,那么它必须实现work()
以同意两者的合同。
JavaDoc说:
实现接口允许类变得更正式 它承诺提供的行为。接口形成合同 在班级和外部世界之间,这个合同是强制执行的 在构建时由编译器。 如果您的班级声称要实施 接口,该接口定义的所有方法必须出现在其中 在类成功编译之前的源代码。
这正是您通过实施work()
方法所做的事情:您同时满足接口A
和B
。
答案 1 :(得分:3)
您的界面只会告诉您实现类需要提供的方法的签名。在您的示例中,A
和B
都要求使用work()
作为返回类型的方法void
。所以基本上他们都要求采用相同的方法。我不知道你怎么可能或需要区分?
答案 2 :(得分:3)
您可能在执行diamand时遇到问题。 你需要自己指定它。
void work() { A.super.work(); } // or B.super.work();
答案 3 :(得分:2)
方法work
将满足两个接口的要求。该方法包含在类中,可以实例化两个接口。为了实现接口,类必须拥有接口中指定的方法。如果使用相同的方法来满足多个接口的要求并不重要。
答案 4 :(得分:2)
JVM不会调用A或B,而只调用Impl实现。您可以转换回A或B,并且您的客户端可以根据特定接口中可用的方法调用方法。