我试过这样做:
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
对象转换为pet
或robot
类型,我也不能像c#一样explicit implementation。
我做错了什么?或者只是在java中不支持?
编辑:因此,java不支持像C#这样的显式接口实现。但对于无法避免的情况,霍尔格的委托方法似乎就是出路。
感谢所有回复。
答案 0 :(得分: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();
}
}
答案 1 :(得分:3)
Java不会这样做。
如果两个接口定义相同签名的方法,则无法区分它们,您只能提供将由两者使用的单个实现。
您必须注意不要以这种方式不兼容的接口结束。
答案 2 :(得分: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, NO 解决。