「こんにちは、アミーゴ! 昨日、あなたは抽象クラスの使い方を学びました。今度は知識を深める時間です。抽象クラスの正しい使い方を教えたいと思います。」

抽象クラスを現実世界に例えて考えるのは困難です。クラスは通常、何らかのエンティティのモデルです。ただし、抽象クラスには実装されていないメソッドが含まれており、実装されているメソッドも含まれている可能性があります。どういう意味ですか?抽象クラスにどのような類似点があるでしょうか? 現実の世界にもそんなものはあるのでしょうか?

実はあるんです。ほぼ完成した車のシャーシがベルトコンベア上に置かれているところを想像してください。スープアップエンジンまたは高効率エンジンのどちらも搭載可能です。レザーインテリアまたはファブリック張りのいずれか。車の具体的な実装はまだ決定されていません。さらに、このシャーシを使用して、いくつかの特定の実装を作成することもできます。しかし、車を現在の形で望んでいる人は誰もいません。これは古典的な抽象クラスです。インスタンスを作成しても意味がないため、作成できません。クラスが意味をなすのは、そのクラスに基づいて作成される多くの本格的な継承者がいるからです。

「それは十分に簡単です。」

しかし、さらに抽象的な類推も可能です。いくつかのメソッドが実装されたインターフェイスに似ています。たとえば、プロの通訳者について考えてみましょう。ソース言語とターゲット言語を指定せずに、「抽象翻訳ツール」を使用します。あるいはボディーガードを検討してください。私たちは彼が武術を習得しており、クライアントを守ることができることを知っているかもしれません。しかし、どの武術でどのように依頼人を守るかは、それぞれのボディーガードの「実行内容」である。

例を見てみましょう:

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 クラスで一般的です。」