99 lines
2.0 KiB
Markdown
99 lines
2.0 KiB
Markdown
<!--
|
|
title: Polymorphie und Vererbung
|
|
description: Folien für Polymorphie und Vererbung in Programmieren 2
|
|
url: https://git.henriburau.de/tutorien/programmieren-2
|
|
header: Programmieren 2 **Tutorium**
|
|
footer: Henri Burau
|
|
-->
|
|
|
|
# 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.
|
|
|