Java 具有相同方法名称的两个接口-方法的实现
假设我有两个接口:Java 具有相同方法名称的两个接口-方法的实现,java,oop,design-patterns,interface,Java,Oop,Design Patterns,Interface,假设我有两个接口: interface IOne { public void method(); } 及 一个具体类实现两个接口: public class A implements IOne, ITwo { public void method(){ //some implementation } } 我的问题是: method()的单一实现是否足以满足接口IOne和ITwo 如果1的答案是肯定的,有没有办法在一个类中同时获得这两种方法?在这种情
interface IOne {
public void method();
}
及
一个具体类实现两个接口:
public class A implements IOne, ITwo {
public void method(){
//some implementation
}
}
我的问题是:
method()
的单一实现是否足以满足接口IOne和ITwoIOne
或ITwo
的实例访问时,将调用该方法
抽象方法的实现是相同的
如果1的答案是肯定的,有没有办法在一个类中同时获得这两个方法
否。如果两种方法都具有相同的签名,就像您的示例中的情况一样,只有一种实现是可能的。在这种情况下,无法为两个接口实现方法的两个版本。因此,是的,这个例子就足够了
如果这两个方法的签名相同,但返回类型不同,这将导致编译错误
如果这两种方法具有不同的签名,那么可以而且必须有两种不同的实现。对于1,答案是是。为类中的方法提供一个实现就足够了,两个接口都可以自动实现
对于2,如果您需要两个方法,那么您的类不应该同时实现这两个接口。但是,您可以使用以下技巧:
interface IOne {
void method();
}
interface ITwo {
void method();
}
public class A
implements IOne, ITwo {
// Anonymous inner class that implements ony IOne
private final IOne one = new IOne() {
@Override
public void method() {
System.out.println("IOne");
}
};
// Anonymous inner class that implements ony ITwo
private final ITwo two = new ITwo() {
@Override
public void method() {
System.out.println("ITwo");
}
};
@Override
public void method() {
System.out.println("A");
}
// Method that delegates to IOne
public void methodIOne() {
this.one.method();
}
// Method that delegates to ITwo
public void methodITwo() {
this.two.method();
}
}
测试代码:
A a = new A();
a.method(); // A
a.methodIOne(); // IOne
a.methodITwo(); // ITwo
类A
不需要实现这两个接口。在这种情况下,不要在A
上实现method()
,只保留匿名内部类。对于(1)-是。我不明白。你能把问题说得更清楚一点吗?匿名类的优点是什么?该逻辑可以直接在methodIOne()
和methodITwo()
@jaco0646中。这只是一个技巧,让同一方法有两个不同的实现。是的,这些方法中可能有逻辑,但您不会强制执行接口contarcts。通过委托给内部类并让它们实现接口,您可以坚持该方法应该做的事情。无论如何,这是一个骗局。如果你不得不做这些事情,也许设计不是很好。这个把戏没有多大意义。如果您希望在IOne和ITwo的两个实例中传递任何内容,请允许使用特定方法访问它们。虽然这不是对答案的批评,但更多的是问题。“我认为OP的设计有一些缺陷。”我同意威廉姆森的说法。实际上,让一个类用同一个方法实现两个接口,并为该方法提供两个不同的实现,每个接口一个,这没有多大意义。但这正是OP所需要的。对于第二个问题,也许桥梁设计模式能有所帮助。
A a = new A();
a.method(); // A
a.methodIOne(); // IOne
a.methodITwo(); // ITwo