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

时间:2015-07-28 12:45:36

标签: java oop design-patterns interface

假设我有两个接口:

interface IOne {

    public void method();

}

interface ITwo {

    public void method();

}

具体类实现两个接口:

public class A implements IOne, ITwo {

    public void method(){
       //some implementation
    }
}

我的问题是:

  1. method()的单个实现是否足以满足IOne和ITwo接口的需要?
  2. 如果 1 的回答是肯定的,有没有办法在单个类中同时获取这两个方法?在这种情况下,我们不必在单个类中实现这两个接口。

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

对于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不需要实现这两个接口。在这种情况下,只是不要在method()上实现A并且只保留匿名内部类。

答案 2 :(得分:2)

  1. 是。当作为IOneITwo的实例访问该类时,将调用该方法。

  2. 没有。方法的名称,返回类型和参数定义方法的签名,同一类中的两个方法不能具有相同的签名。这样做会导致编译时错误。

    我建议的一个解决方案是为IOne.method和ITwo.method使用不同的方法名称,从而使每个方法的签名都是唯一的。这将允许您在单个类中定义两个唯一方法。

答案 3 :(得分:2)

  

method()的单个实现是否足以满足接口IOne和ITwo的需要?

是。 abstract方法的实现方式相同。

  

如果1的答案是肯定的,有没有办法在单个课程中同时获得这两种方法?

没有