4

我试着这样做:

interface pet {
    void sleep();
}
interface robot {
    void sleep();
}

public class roboGarfield implements pet , robot {

    /*
     * this gives error
    void pet.sleep(){

    }
    */

    @Override
    public void sleep() { System.out.println("this isn't really specific.."); }

    public static void main(String[] args){
        roboGarfield t = new roboGarfield();
        t.sleep();
        ((pet)t).sleep(); // similar to C# 
        ((robot)t).sleep();
    }    
}

但即使我可以将roboGarfeild对象转换为它的petrobot类型,我也不能像 c# 那样做一个显式的实现。

有什么我做错了吗?还是只是在 java 中不支持?

编辑:所以,java 不支持像 C# 这样的显式接口实现。但是对于无法避免的情况,Holger 的委托方法似乎是一条出路。

感谢所有的答复。

4

3 回答 3

4

这类问题的标准解决方案是使用委托:

interface pet {
    void sleep();
}
interface robot {
    void sleep();
}

public class roboGarfield {

    private final pet myPetIdentity = new pet() {
      public void sleep() { System.out.println("sleeping as pet"); }
      public String toString() { return roboGarfield.this.toString(); };
    };
    private final robot myRobotIdentity = new robot() {
      public void sleep() { System.out.println("recharging as robot"); }
      public String toString() { return roboGarfield.this.toString(); };
    };

    public final pet asPet() {
      return myPetIdentity;
    }
    public final robot asRobot() {
      return myRobotIdentity;
    }
    public static void main(String[] args){
        roboGarfield t = new roboGarfield();
        t.asPet().sleep(); 
        t.asRobot().sleep();
    }    
}

对于更大的方法,建议让内部类委托给外部类以保持内部类简短。此外,子类可以覆盖这些方法,而无需处理委托内容。

public class roboGarfield {

    private final pet myPetIdentity = new pet() {
      public void sleep() { petSleep(); }
      public String toString() { return roboGarfield.this.toString(); };
    };
    private final robot myRobotIdentity = new robot() {
      public void sleep() { roboSleep(); }
      public String toString() { return roboGarfield.this.toString(); };
    };

    public void roboSleep()
    {
      System.out.println("recharging as robot");
    }
    public void petSleep()
    {
      System.out.println("sleeping as pet");
    }
    public final pet asPet() {
      return myPetIdentity;
    }
    public final robot asRobot() {
      return myRobotIdentity;
    }
    public static void main(String[] args){
        roboGarfield t = new roboGarfield();
        t.asPet().sleep(); 
        t.asRobot().sleep();
    }    
}
于 2013-10-01T08:31:02.197 回答
3

Java 不这样做。

如果两个接口定义了相同签名的方法,则无法区分它们,您只能提供两个接口都将使用的单个实现。

您必须注意不要以这种方式出现不兼容的接口。

于 2013-10-01T08:11:58.473 回答
1
public class roboGarfield implements pet , robot {

     @ovveride
     public void  sleep(){
         //here you are implementing sleep method
         //But satisfying both pet and robot interface's sleep method.
     }

当您这样做时,在 java 中,单一实现适用于两者interface。AFAIK,没有解决方法。

于 2013-10-01T08:11:29.850 回答