100 lines
2.2 KiB
Markdown
100 lines
2.2 KiB
Markdown
<!--
|
|
title: Abstrakte Klasse
|
|
description: Folien für abstrakte Klassen in Programmieren 2
|
|
url: https://git.henriburau.de/tutorien/programmieren-2
|
|
header: Programmieren 2 **Tutorium**
|
|
footer: Henri Burau
|
|
-->
|
|
|
|
# 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.
|