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

Sid*_*Sid 15 java oop overriding interface

这段代码完美无缺.方法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();
Run Code Online (Sandbox Code Playgroud)

JRE*_*REN 15

因为它是一个界面,所以没有任何伤害.你基本上是C通过实现A和为你的班级使用蓝图B.双方AB说,C应实施一个名为方法test()

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

它基本上是你的C班级说:"哦,嘿,我需要实现test()因为接口A"而你实现它.然后你的C班级说"哦,嘿,我需要test()再次实现因为接口B"而且它看到已经有一个叫做test()实现的方法,所以它很满意.

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


and*_*otn 6

JLS§8.4.8.4说,

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

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

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


use*_*574 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);
}
Run Code Online (Sandbox Code Playgroud)

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

public class JackOfAllTrades implements StockBroker, Doctor{
   public String adviseClient(Client c){
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

在这种情况下,对象JackOfAllTrades不知道要给出什么类型的建议,因为该adviseClient()方法没有参数告诉它在adviseClient()调用时应该实现哪个接口.

这是Java的一个缺点,因为设计Doctor界面的人可能无法知道其他人会设计StockBroker具有相同方法签名的界面.

对于任何创建接口的人来说,最好的方法是使方法名称足够独特,名称冲突很少见.