Java 是否支持像 c# 这样的显式接口实现?
本文关键字:显式接口实现 是否 支持 Java | 更新日期: 2023-09-27 18:33:29
我尝试这样做:
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# 那样执行显式实现。
我做错了什么? 还是只是在 java 中不受支持?
编辑:所以,java不支持像C#这样的显式接口实现。但对于无法避免的情况,霍尔格的委托方法似乎是出路。
感谢您的所有回复。
这种问题的标准解决方案是使用委派:
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();
}
}
Java不会这样做。
如果两个接口定义了相同签名的方法,则无法区分它们,并且只能提供两个接口将使用的单个实现。
您必须注意不要以这种方式获得不兼容的接口。
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,没有解决方法。