接口多重继承的冲突方法

时间:2014-04-23 22:29:56

标签: java oop

我有以下界面(在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,这将是微不足道的)?

5 个答案:

答案 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的一些变种也是如此。如果它很重要,我可以找到更多的例子。