有一个交通工具接口 Vehicle,包含 getSpeed 方法
然后有船只接口 Boat 继承自交通工具接口,包含 sail 方法,
有飞机接口 Plane 继承自交通工具借口,包含 fly 方法。
现在有一个又可以飞又可以航行的交通工具 BoatPlane,它要实现 Boat 和 Plane 两个接口
请看这样的代码:
public class Test {
public static void main(String[] args) {
Boat boat = new BoatPlane();
boat.sail();
System.out.println(boat.getSpeed()); // 输出1
Plane plane = (Plane) boat;
plane.fly();
System.out.println(plane.getSpeed()); // 输出2
}
}
interface Vehicle {
int getSpeed();
}
interface Boat extends Vehicle {
void sail();
}
interface Plane extends Vehicle {
void fly();
}
class BoatPlane implements Boat, Plane {
@Override
public int getSpeed() {
return 10;
}
@Override
public void sail() {
System.out.println("sail()");
}
@Override
public void fly() {
System.out.println("fly()");
}
}
现在,输出 1 和输出 2 的结果是一样的。
但是,我希望 Boat 和 Plane 在调用 getSpeed 时结果不一样,请问如何做到?
我在 StackOverFlow 中查到,Java 中不存在菱形继承导致的问题,因为具有相同方法签名的两个方法会被合并成一个。
这样 Java 就似乎不能通过接口来实现这样的功能了。
那么,Java 中有什么相对优雅的方式来实现呢?
如果有两个速度,实际上是有一个内蕴状态的,如果希望分开,不如直接定义成getFlySpeed和getSailSpeed