具有相同方法名称的两个接口 - 方法的实现

Raz*_*zib 8 java oop design-patterns interface

假设我有两个接口:

interface IOne {

    public void method();

}
Run Code Online (Sandbox Code Playgroud)

interface ITwo {

    public void method();

}
Run Code Online (Sandbox Code Playgroud)

具体类实现了两个接口:

public class A implements IOne, ITwo {

    public void method(){
       //some implementation
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. method()对于接口IOne和ITwo ,单个实现是否足够?
  2. 如果1的答案是肯定的,有没有办法在单个类中同时获得这两个方法?在这种情况下,我们不必在单个类中实现这两个接口.

Tim*_*imo 5

如果两种方法具有相同的签名(如您的示例中的情况),则只能实现一种实现。在这种情况下,没有办法为两个接口实现该方法的两个版本。所以是的,这个例子就足够了。

如果两个方法的签名相同,但它们具有不同的返回类型,则会导致编译错误。

如果这两个方法具有不同的签名,则可以而且必须有两种不同的实现。


Fed*_*ner 4

对于1,答案是肯定的。只需为类中的方法提供一种实现即可自动实现两个接口。

对于2,如果您需要同时拥有这两种方法,那么您的类不应该实现这两个接口。但是,您可以使用一个技巧:

interface IOne {

    void method();
}

interface ITwo {

    void method();
}

public class A
    implements IOne, ITwo {

    // Anonymous inner class that implements only IOne
    private final IOne one = new IOne() {

        @Override
        public void method() {
            System.out.println("IOne");
        }
    };

    // Anonymous inner class that implements only 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

测试代码:

A a = new A();
a.method(); // A
a.methodIOne(); // IOne
a.methodITwo(); // ITwo
Run Code Online (Sandbox Code Playgroud)

A不需要实现这两个接口。在这种情况下,只需不要实现method()A仅保留匿名内部类即可。

  • 这个技巧没有多大意义。如果您想要在 IOne 和 ITwo 的 2 个实例中传递任何内容,请允许使用特定方法访问它们。虽然这不是对答案的批评,而是对问题的批评。我认为OP的设计有一些缺陷。 (2认同)