# Polymorphie und Vererbung --- # Typ und Implementation Der **Typ** ist die Außenansicht auf einen Dienstleister. - Welche Operationen gibt es? - Wie rufe ich diese auf? Die **Implementation** ist die Innenansicht auf einen Dienstleister. - Wie wird eine Operation umgesetzt? - Welche Felder habe ich? --- # Klassen und Interfaces **Klassen** haben immer eine Doppelrolle, da sie sowohl einen Typ als auch eine Implementation definieren. **Interfaces** sollten immer nur einen Typ definieren. --- # Vererbung Weitergeben von bereits geschriebenen Code an Subklassen. Sinnvoll auch zum Aufstellen einer Vererbungshierarchie. - Eine Klasse kann erben von: Klassen und abstrakten Klasse - Ein Interface kann erben von: Interfaces --- ## Deklaration - Klassen ```java class Shape { public String toString() { return "Shape"; } } class Rectangle extends Shape { public String toString() { return "Rectangle"; } } class Circle extends Shape { public String toString() { return "Circle"; } } ``` --- ## Deklaration - Interfaces ```java // Repräsentiert eine 2D Form interface Form { double gibFlaeche(); } // Repräsentiert ein 2D Dreieck interface Dreieck extends Shape { double gibHoehe(); } ``` --- ## Benutzung ```java // In main... Shape shape = new Shape(); Rectangle rectangle = new Rectangle(); shape.toString(); rectangle.toString(); shape = rectangle; shape.toString(); ``` --- # Aufgaben * Schreibe eine Klasse `Cow`, welche dieselben Methoden hat wie ein `Sheep` * Ergänze `Cow` und `Sheep` um eine Methode `String makeNoise()`, ein `Schaf` soll `"Mäh"` zurückgeben, eine `Cow` `"Muh"`. * Schreibe nun eine Klasse `Animal`. Von dieser Klasse sollen `Sheep` und `Cow` erben. Alle Methoden die bei `Sheep` und `Cow` genau gleich sind, sollen nun in die Superklasse `Animal` verschoben werden.