我有以下界面(在Java中,但它更多的是OO问题,而不是语言特定的,我对任何语言的答案感兴趣)
public interface A {
int foo();
}
和
public interface B {
char foo();
}
如果我现在要进行以下课程:
public class C implements A,B{
public int foo() {
return 0;
}
public char foo() {
return 0;
}
}
由于方法存在冲突,因此无法编译。有没有办法让这项工作,或具有相同含义的东西(当然不修改A或B,这将是微不足道的)?
答案 0 :(得分:1)
不,返回类型不能成为使方法签名唯一的决定因素,因为您不需要将返回的值分配给任何东西,编译器在这种情况下不知道该怎么做。
具体例子:
...
C object = new C();
object.foo();
...
我刚才打电话给哪个foo?说不出来。
要完成这项工作,您需要在接口方法中使用不同的方法名称或不同的参数类型。
编辑:假设您无法控制接口A和B(库类或类似),如果我想在同一个类中实现它们,这就是我要采取的解决方案:
public class C {
private objectA = new AImpl();
private objectB = new BImpl();
// Work with the objects here
private class AImpl implements A {
public int foo() {
// ...
}
}
private class BImpl implements B {
public char foo() {
// ...
}
}
}
答案 1 :(得分:1)
存在此问题是因为在OOP中,认为存在多个具有相同名称但具有不同参数而非返回类型的方法。
问题不在于界面,问题在于类。
答案 2 :(得分:1)
常见的解决方案是为每个方法指定一个不同的名称。避免使用很有可能命名与其他接口冲突的通用名称。
答案 3 :(得分:0)
重载带有参数。
答案 4 :(得分:0)
使用此问题有几种解决方案。我正在假设这些是独立的接口,意图是多个接口(在同一个对象上实现两个不相关的接口),并且重载与它无关。
我所知道的解决方案是: 1.范围界定。对foo()的引用可以被限定为A.foo()或B.foo()以确定哪个是必需的。 1.命名空间。接口在为此目的构造的命名空间内继承,并且对foo()的所有引用必须以命名空间开头,例如A :: foo(),B :: foo()。 别名。在继承时显式重命名了一个或两个foo()方法。调用变得像A_foo()和B_foo()。
Ada肯定有这样的机制,我认为Pascal的一些变种也是如此。如果它很重要,我可以找到更多的例子。