“你好,阿米戈!昨天你学习了抽象类。现在巩固下这个知识点吧。我想教你如何正确使用抽象类。”

现在一时想不起来抽象类的现实类比。类通常是某个实体的模型。抽象类主要包含尚未实现的方法,但也可以包含已实现的方法。这是什么意思呢?我们能不能找一个抽象类的类比?现实生活中有没有这样的例子?

事实上还真有。想象一下传送带上一辆接近成品的汽车的底盘。我可以安装加强型发动机,也可以安装高效发动机。可以装皮革内饰,也可以装织物内饰。汽车具体的实现尚未决定。此外,底盘也可用来产生几种特定的实现。但是当前形式的汽车是没人要的。这是一个经典的抽象类:创建它的实例没有任何意义,因此你无法创建它们;该类之所以有意义,是因为在此基础上创建了许多完整的继承人。

“这很简单!”

不过可能还有更抽象的类比。更像包含一些已实现方法的接口。例如,一个专业的口译员。在不指定源语言和目标语言的情况下,他就是“抽象翻译员”。或者说保镖。我们可能知道他精通武功,可以保护他的客户。但他身怀哪些绝技,又如何保护客户,这些都是这个保镖的“实现细节”。

让我们看这样一个例子:

Java 语言代码 说明
abstract class BodyGuard
{
 abstract void applyMartialArts(Attacker attacker);

 void shoot(Attacker attacker)
 {
    gun.shoot(attacker);
 }

 void saveClientLife(Attacker attacker)
 {
  if (attacker.hasGun())
     shoot(attacker);
  else
     applyMartialArts(attacker);
 }
}
BodyGuard 类决定如何应对攻击:开枪或用武功。

不过,何种路数的武功并未指定,尽管我们确定该技能存在。

我们可以通过继承这个类的方式创建几个不同的保镖。所有保镖都能够保护客户并射杀攻击者。

“你说的对!它更像是一个包含已实现方法的接口。”

“是的,这种类型的抽象类在标准的 Java SE 类中很常见。”