Java 接口如何模拟多重继承?
2022-08-31 12:56:52
我正在阅读“Java教程”(第二次)。我刚刚(再次)完成了接口部分,但仍然不了解Java接口如何模拟多重继承。有没有比书中更清晰的解释?
我正在阅读“Java教程”(第二次)。我刚刚(再次)完成了接口部分,但仍然不了解Java接口如何模拟多重继承。有没有比书中更清晰的解释?
假设您的领域中有2种东西:卡车和厨房
卡车有一个driveTo()方法和一个厨房一个厨师()方法。
现在假设泡利决定从送货卡车的后面卖披萨。他想要一个他可以开车去()和做饭()的东西。
在C++,他会使用多重继承来做到这一点。
在Java中,这被认为太危险了,所以你可以从主类继承,但你可以从接口“继承”行为,这些接口是所有意图和目的的抽象类,没有字段或方法实现。
因此,在Java中,我们倾向于使用委托来实现多重继承:
Pauli 对卡车进行子分类,并在名为 kitchen 的成员变量中向卡车添加厨房。他通过调用 kitchen.cook() 来实现 Kitchen 接口。
class PizzaTruck extends Truck implements Kitchen {
Kitchen kitchen;
public void cook(Food foodItem) {
kitchen.cook(foodItem);
}
}
他是一个快乐的人,因为他现在可以做这样的事情;
pizzaTruck.driveTo(beach);
pizzaTruck.cook(pizzaWithExtraAnchovies);
好吧,这个愚蠢的故事是为了表明它不是多重继承的模拟,它是真正的多重继承,条件是你只能继承契约,只能从称为接口的空抽象基类继承。
(更新:随着默认方法的出现,接口现在也可以提供一些被继承的行为)
您可能会感到困惑,因为您在本地查看多个继承,即一个类从多个父级继承实现详细信息。这在Java中是不可能的(并且经常导致在可能的语言中被滥用)。
接口允许类型的多重继承,例如,a 可以被其他类使用,就好像它是 a 一样,就好像它是 .这就是多重继承的更深层含义:允许一个对象同时充当它属于几个不相关的不同类的行为。class Waterfowl extends Bird implements Swimmer
Bird
Swimmer