Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有相同方法名称的两个接口-方法的实现_Java_Oop_Design Patterns_Interface - Fatal编程技术网

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和ITwo
  • 如果1的答案是肯定的,有没有办法在一个类中同时获得这两种方法?在这种情况下,我们不必在一个类中实现两个接口
  • 对。当类作为
    IOne
    ITwo
    的实例访问时,将调用该方法

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

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

  • method()one的单一实现是否足以满足接口IOne和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