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

2022-09-03 04:45:22

此代码工作完美。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();

答案 1

因为它是一个接口,所以没有造成任何伤害。您基本上是通过实现 和 来为类使用蓝图。两者都说,应该实现一个叫做CABABCtest()

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

这基本上是你的班级在说:“哦,嘿,我需要实现,因为接口”,然后你实现它。然后你的类说“哦,嘿,我需要再次实现,因为接口”,它看到已经有一个名为enfected的方法,所以它很满意。Ctest()ACtest()Btest()

您也可以在这里找到更多信息: JLS §8.4.8.4


答案 2

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

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){
   }
}

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

使用实现接口的对象的人希望该方法提供医疗建议。但是,使用实现接口的对象的人希望该方法给出投资策略。DoctoradviseClient()StockBrokeradviseClient()

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

这在Java中是一个缺点,因为设计接口的人可能不知道其他人会使用相同的方法签名设计接口。DoctorStockBroker

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