实现具有相同方法的多个接口

时间:2013-07-05 08:24:14

标签: java oop interface method-overriding

此代码完美无缺。方法test()适用于两个接口。引擎盖下究竟发生了什么?这个功能在实际场景中有用吗?

interface A
{
    void test();
}

interface B 
{
    void test();
}

class C implements A, B
{

    public void test() 
    {
        System.out.println("abc");
    }
}

   A a = new C();
   a.test();
   B b = new C();
   b.test();

5 个答案:

答案 0 :(得分:14)

因为它是一个界面,所以没有任何伤害。您实际上是通过实施CA为您的B课程使用蓝图。 AB都说C应该实现名为test()的方法

您的C类实现了该方法,因此接口已完成其工作。

基本上你的C课说:“哦,嘿,我需要实现test()因为接口A”而你实现它。然后你的C课说“哦,嘿,我需要再次实施test()因为接口B”而且它看到已经有一个名为test()的方法已经实现了所以它是满意。

您还可以在此处找到更多信息:JLS §8.4.8.4

答案 1 :(得分:6)

JLS §8.4.8.4说,

  

使用覆盖等效签名继承方法

     

类可以使用覆盖等效签名(第8.4.2节)来继承多个方法   ...
  可能有几个路径可以从接口继承相同的方法声明。这个事实没有任何困难,从来没有导致编译时错误。

似乎理由是如果一个类具有多个具有相同名称和签名的声明,因为该类可能通过多个路径继承它们 - 实现接口并且还子类化实现该接口的类,例如-no伤害已经完成。

答案 2 :(得分:6)

假设我们有两个接口......

public interface StockBroker{
        //Give our client some investment strategies.
        public String adviseClient(Client c);
}

public interface Doctor{
  //Examine our client and give them some medical advice
        public String adviseClient(Client c);
}

实现两个接口的类......

public class JackOfAllTrades implements StockBroker, Doctor{
   public String adviseClient(Client c){
   }
}

虽然使用一种方法实现两个接口在语法上可能是正确的,但您可能无法获得所需的行为。例如,股票经纪人和医生通常都会给客户提供截然不同的建议。

使用实现接口Doctor的对象的人希望adviseClient()方法提供医疗建议。但是,使用实现接口StockBroker的对象的人希望adviseClient()方法提供投资策略。

在这种情况下,对象JackOfAllTrades不知道要提供什么类型的建议,因为adviseClient()方法没有参数告诉它在{{1}时应该实现哪个接口} 叫做。

这是Java的一个缺点,因为设计adviseClient()接口的人可能无法知道其他人会设计具有相同方法签名的Doctor接口。

对于任何创建接口的人来说,这可能是一种很好的做法,使方法名称足够独特,名称冲突很少。

答案 3 :(得分:2)

就语法而言,如果不遵守其中一个intent的{​​{1}},则其合同将被破坏,代码可被视为已损坏

用你的比喻,如果我答应迈克尔穿蓝色衬衫而不是红色衬衫,我不能穿两件衬衫,那么我将至少打破一个承诺。

同样可以适用于这些方法:如果保留一个合同意味着打破另一个合同,那么methods implement interfaces实际上是个坏主意。

修改:合同已损坏,按照Class C signature它应该实现两种方法,但最终只实施一种method并省略另一种方法。

Reference

答案 4 :(得分:2)

interface A
{
void test();
}

interface B 
{
void test();
}
class C implements A, B {

    public void test() 
    {
        System.out.println("common to all");
    }
    public A choose(A a){
        return new A(){
           public void test() {
                System.out.println("test of A");
           }
        };
    }
    public B choose(B b){
        return new B(){
           public void test() {
            System.out.println("test of B");
           }
        };
    }
}
class Demo {
   public static void main(String[] args) {
   C c =new C();

   A a = new C();
   B b = new B();

   a = c.choose(a);
   b = c.choose(b);

   a.test();
   b.test();
   }
}