„Hallo Amigo! Gestern wurdest du in den Möglichkeiten der abstrakten Klassen unterrichtet. Jetzt ist es Zeit, unser Wissen zu vertiefen. Ich möchte dir beibringen, wie man abstrakte Klassen richtig einsetzt.“

Es ist schwierig, eine Analogie für eine abstrakte Klasse aus der realen Welt zu finden. Eine Klasse ist normalerweise ein Modell irgendeiner Entität. Aber eine abstrakte Klasse enthält Methoden, die nicht implementiert wurden, und kann auch implementierte Methoden enthalten. Was bedeutet das? Können wir eine Analogie für eine abstrakte Klasse finden? Gibt es so etwas in der realen Welt?

Ja, das gibt es tatsächlich. Stell dir das Fahrgestell eines fast fertigen Autos auf einem Fließband vor. Ich kann entweder einen aufgemotzten Motor oder einen hocheffizienten Motor einbauen. Entweder eine Lederausstattung oder eine Stoffpolsterung. Die konkrete Implementierung des Autos steht noch nicht fest. Darüber hinaus könnten mit dem Fahrgestell mehrere spezifische Implementierungen realisiert werden. Aber niemand will das Auto in seiner jetzigen Form. Dies ist eine klassische abstrakte Klasse: Das Erstellen von Instanzen dieser Klasse würde keinen Sinn ergeben, also kann man sie nicht erstellen; die Klasse ergibt nur wegen der vielen vollwertigen Erben, die auf ihrer Basis erstellt werden, Sinn.

„Das klingt nachvollziehbar.“

Aber es könnte noch mehr abstrakte Analogien geben. Eher so wie Interfaces mit wenigen implementierten Methoden. Stell dir zum Beispiel einen professionellen Dolmetscher vor. Ohne Angabe der Ausgangs- und Zielsprache haben wir einen ‚abstrakten Dolmetscher‘ Oder nehmen wir einen Personenschützer. Wir wissen vielleicht, dass er die Kampfkünste beherrscht und seinen Klienten beschützen kann. Aber welche Kampfkünste und wie er den Klienten schützen wird, sind „Implementierungsdetails“ jedes einzelnen Personenschützers.

Sehen wir uns ein Beispiel an:

Java-Code Beschreibung
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);
 }
}
Die BodyGuard-Klasse bestimmt, wie man mit einem Angriff umgeht: schießen oder Kampfkünste anwenden.

Die spezifische Kampfkunst ist jedoch nicht festgelegt, obwohl wir sicher sind, dass die Fähigkeit vorhanden ist.

Wir können mehrere verschiedene Personenschützer erstellen (durch Vererbung dieser Klasse). Alle werden in der Lage sein, den Kunden zu schützen und auf den Angreifer zu schießen.

„Das stimmt. Das ist wie ein Interface mit ein paar implementierten Methoden.“

„Ja, diese Art von abstrakter Klasse ist unter den Java-SE-Standardklassen üblich.“