“你好,阿米戈!昨天你學習了抽像類的方法,現在是加深我們知識的時候了。我想教你如何正確使用抽像類。”

很難為抽像類想出一個現實世界的類比。類通常是某個實體的模型。但是抽像類包含沒有實現的方法,也可以包含已經實現的方法。這意味著什麼?我們可以找到抽像類的什麼類比?現實世界中有這樣的事情嗎?

其實是有的。想像一下傳送帶上一輛幾乎完成的汽車的底盤。我可以安裝增強型引擎或高效引擎。皮革內飾或織物內飾。該車的具體實施方式尚未確定。更重要的是,底盤可用於生產幾種特定的實施方式。但是沒有人想要目前形式的汽車。這是一個經典的抽像類:創建它的實例沒有意義,所以你不能創建它們;該類之所以有意義,是因為將在其基礎上創建許多成熟的繼承人。

“這很容易。”

但還可以有更抽象的類比。更像是帶有一些已實現方法的接口。例如,考慮一位專業口譯員。在不指定源語言和目標語言的情況下,我們有一個“抽象翻譯器”。或者考慮保鏢。我們可能知道他精通武術,可以保護他的客戶。但具體有哪些武功,如何保護委託人,則是每個具體保鏢的“實施細則”。

讓我們看一個例子:

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 類中很常見。”