===== Abstrakte Klassen =====
{{ :polymorphismus:pasted:20230309-175706.png?400 }}
Es macht eigentlich **keinen** Sinn, die Methode ''sagwas()'' in der Klasse Tier zu implementieren. Es würde reichen, sie dort nur zu **deklarieren** (''void sagwas();'') und die **Implementierung** (d.h. die Erstellung der Anweisungen in der Methode drin) den Unterklassen ''Katze'' und ''Hund'' zu überlassen. Dies können wir erreichen, indem wir die Klasse Tier und die Methode ''sagwas()'' als **abstract** deklarieren:
{{ :polymorphismus:pasted:20230310-115633.png }}
**Merke:** \\
* Wird eine Methode in einer Klasse nur **deklariert**, aber nicht **implementiert**, so nennt man sie **abstrakte Methode**.
* Eine Klasse, die mindestens eine abstrakte Methode besitzt, heißt **abstrakte Klasse**.
* Von einer abstrakten Klasse kann man keine Objekte instanzieren, wohl aber von Unterklassen, bei denen alle abstrakten Methoden implementiert sind.
* Der Compiler stellt sicher, dass jede nicht-abstrakte Unterklasse einer abstrakten Klasse für alle abstrakten Methoden eine Implementierung besitzt.
===== Beispiel 2: Raumschiff mit verschiedenen Kanonen =====
{{ :polymorphismus:pasted:20230310-120603.png }}
**Aufgabe: ** \\ \\
Erfinde eine andere Art von Kanone, schreibe eine entsprechende Klasse und probiere sie im obigen Programm aus.