“你好,阿米戈!终于要说一些有趣的内容了。今天我要说一说多重继承。多重继承非常有趣,而且又很强大。如果不是因为几个问题,Java 完全可以支持类的多重继承。但现实就是如此,不过它支持类实现多个接口,我们也就心满意足了。可别小看了这个功能。”

继承多个接口 - 1

假设你在写一个计算机游戏。它的角色(你的对象)的行为方式非常复杂:在地图上行走,收集物品,执行目标,与其他角色对话,杀死某人,拯救他人。假设你已经将所有对象划分为 20 个类别。这就意味着,如果你够幸运的话,你就只需要 20 个类来定义对象。但有个问题:这些对象有多少种不同形式的交互。每种类型的对象都可以与其他 20 种对象进行互动(我们还计算出相同类型对象的互动)。换句话说,你要编写 20 x 20 = 400 次交互的代码!如果这种唯一类型对象的数量不是 20,而是 100,那么交互的数量可能是 10000!

“哇!”现在我知道为什么编程这么难了。”

“现在简单了。我们可以用抽象,当然,还有接口的多重继承。”

如果角色和/或能力交互而不是对象本身交互,我们通常可以简化对象交互。而且,我们也已经知道,在类实现某些接口时,能力可轻松添加到类中。

编写大程序时,开发人员通常从一开始就这么做:

1)确定所有能力/角色。

2)定义这些角色之间的交互。

3)然后只要将角色分配给所有类。

“可以举个例子吗?”

“当然。还让我们看看动画片《汤姆和杰瑞》里的角色”。

Java 语言代码 说明
interface Moveable
{}
— 角色/移动能力。
interface Eatable
{}
— 角色/被吃的能力。
interface Eat
{}
— 角色/吃别人的能力。
class Tom extends Cat implements Moveable, Eatable, Eat
{}
汤姆是一只具有三个角色的猫:
1) 他可以移动
2) 他可以吃别人
3) 他可以被别人(狗)吃掉
class Jerry extends Mouse implements Moveable, Eatable
{}
杰里是具有两个角色的老鼠:
1) 他可以移动
2) 他可以被别人吃掉
class Killer extends Dog implements Moveable, Eat
{}
Killer(杀手)是一条具有两个角色的狗:1) 他可以移动 2) 他可以吃别人

只要了解这三个角色(接口),你就可以编写程序并描述这些角色之间的正确交互。例如,一个对象会追逐(通过 Moveable 接口)“你可以吃的人”,并远离“一个可以吃掉你的人”的对象。所有这些都不需要了解特定对象。如果你要在程序中添加更多对象(类)并保留这些角色,它仍可以很好地运行,从而控制对象的行为。