# Abstrakte Klassen --- # Abstrakte Klassen In abstrakten Klassen können Operationen **ohne** eine Implementation deklariert werden. ```java abstract double gibFlaeche(); ``` --- # Abstrakte Klassen Eine Klasse mit mindestens einer abstrakten Methode muss abstrakt sein. Es können keine Instanzen einer abstrakten Klasse erzeugt werden. ```java abstract class Form { abstract double gibFlaeche(); String toString() { return "Form"; } } ``` --- # Benutzung Es können keine Instanzen einer abstrakten Klasse erzeugt werden. Trotzdem definieren die abstrakten Klassen einen Typ. ```java // Deklaration class Kreis extends Form { private double _radius; Circle(double rad) {radius = rad;} double gibFlaeche(){ return 3.14 * radius * radius; } } // Benutzung Form form1 = new Kreis(4.5); ``` --- # Verwendung Abstrakte Klassen werden immer benutzt wenn Code wiederverwendet werden soll, aber nicht alle Details bekannt sind. Dabei wird häufig das Prinzip der Schablonen- und Einschubmethoden genutzt. ```java abstract class DreidimensionaleForm { private double _hoehe; abstract double gibFlaeche(); double gibVolumen() { return gibFlaeche() * _hoehe; } } ``` * Welche Methode ist die Einschubmethode und welche die Schablonenmethode? --- # Übung 1) Müssen alle abstrakten Methoden eine abstrakten Klasse in einer Subklasse implementiert werden? * Wenn die Subklasse nicht auch `abstract` sein darf, dann ja. 2) Sind alle Felder der abstrakten Klasse auch in der Subklasse enthalten? * Ja 3) Darf auf alle Felder der Superklasse aus der Subklasse zugegriffen werden? * Nur solange die Modifier `public`, `protected` oder `package private` sind. --- 4) Ändere die Klasse `Animal` zu einer abstrakten Klasse. Alle Methoden die bei `Sheep` und `Cow` gleich sind müssen nicht abstrakt sein. Füge aber eine abstrakte Methode `String makeNoise()` ein. Ändere den Code and den richtigen Stellen ab.