Abstrakte Klasse: Unterschied zwischen den Versionen

Aus KGS-Wiki
(Die Seite wurde neu angelegt: „Eine abstrakte Klasse ist eine besondere Art von Klasse (Informatik). Manche Klassen möchte man nicht direkt instanziieren können, sondern nur ihre Kinder. Dann kann man diese Klasse als '''abstrakt''' deklarieren, Abstrakte Klassen dürfen auch '''abstrakte Methoden''' enthalten, deren Methodenrumpf leer ist und deren Verhalten für jede Kind-Klasse einzeln definiert werden ''muss''.<syntaxhighlight lang="java" line…“)
 
KKeine Bearbeitungszusammenfassung
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
Eine [[abstrakte Klasse]] ist eine besondere Art von [[Klasse (Informatik)|Klasse]].
Eine [[abstrakte Klasse]] ist eine besondere Art von [[Klasse (Informatik)|Klasse]].


Manche Klassen möchte man nicht direkt instanziieren können, sondern nur ihre [[Vererbung (Informatik)|Kinder]]. Dann kann man diese Klasse als '''abstrakt''' deklarieren, Abstrakte Klassen dürfen auch '''abstrakte Methoden''' enthalten, deren Methodenrumpf leer ist und deren Verhalten für jede Kind-Klasse einzeln definiert werden ''muss''.<syntaxhighlight lang="java" line="1">
Manche Klassen möchte man nicht direkt instanziieren können, sondern nur ihre [[Vererbung (Informatik)|Kinder]]. Dann kann man diese Klasse als '''abstrakt''' deklarieren.
 
Von abstrakten Klassen können nicht direkt Objekte erzeugt werden. Wenn man das möchte, muss man eine Unterklasse implementieren, die von der abstrakten Klasse erbt. Abstrakte Klassen dürfen neben normalen Methoden, die regulär vererbt werden, auch '''abstrakte Methoden''' enthalten, deren Methodenrumpf leer ist und deren Verhalten für jede Kind-Klasse einzeln definiert werden ''muss''. Durch die Vererbung der Methoden bzw. wenigstens der Methoden-Schnittstellen kann mit einer abstrakten Klasse sichergestellt werden, dass alle ihrer Kind-Klassen ein vorhersehbares Verhalten aufweisen.
 
In UML-Klassendiagrammen werden abstrakte Klassen und Methoden durch ''kursive Schrift'' hervorgehoben.
 
== Ein fiktives Beispiel ==
{{Thumbnailbox|INHALT=
<uml>
@startuml
abstract class Animal {
  + {abstract} makeNoise()
  + eat()
}
 
class Dog {
  + makeNoise()
}
 
class Cat {
  + makeNoise()
  + eat()
}
Animal <|-- Cat
Animal <|-- Dog
@enduml
</uml>
|CAPTION=Der rechts dargestellte Quelltext als [[UML]]-[[Klassendiagramm]]}}
 
<syntaxhighlight lang="java" line="1">
public abstract class Animal {
public abstract class Animal {
      
      
Zeile 29: Zeile 58:


     public void eat() {
     public void eat() {
         super.eat();
         super.eat(); // ruft die eat()-Methode der Oberklasse auf
         wait();
         wait();
         vomitTheWholeCrapOverTheLivingRoomCarpet();
         vomitAllOVerTheCarpet();
     }
     }


Zeile 37: Zeile 66:


</syntaxhighlight>In diesem Beispiel können keine <code>Animal</code>-Objekte mit dem Aufruf <code>new Animal()</code> erzeugt werden. <code>Animal</code> legt aber fest, dass alle Unterklassen wie <code>Dog</code> und <code>Cat</code> eine Methode namens <code>makeNoise()</code> enthalten müssen.
</syntaxhighlight>In diesem Beispiel können keine <code>Animal</code>-Objekte mit dem Aufruf <code>new Animal()</code> erzeugt werden. <code>Animal</code> legt aber fest, dass alle Unterklassen wie <code>Dog</code> und <code>Cat</code> eine Methode namens <code>makeNoise()</code> enthalten müssen.
Darauf aufbauend kann man nun z.B. eine Liste von Tieren anlegen:<syntaxhighlight lang="java" line="1">
public static void main(String[] args) {
    Cat felix = new Cat();
    Cat luna = new Cat();
    Dog milow = new Dog();
    Dog fiete = new Dog();
    ArrayList<Animal> zoo = new ArrayList<Animal>();
    zoo.add(felix);
    zoo.add(luna);
    zoo.add(milow);
    zoo.add(fiete);
    for(Animal a : zoo) {
        a.makeNoise();
    }
}
</syntaxhighlight>Zur <code>ArrayList</code> <code>zoo</code> dürfen nur Objekte hinzugefügt werden, die der Klasse <code>Animal</code> oder einer ihrer Unterklassen angehören. Die <code>for</code>-Wiederholung am Ende des Codeschnipsels erzeugt dann die folgende Ausgabe:<syntaxhighlight lang="java">
meow!
meow!
woof!
woof!
</syntaxhighlight>Dadurch, dass die <code>ArrayList</code> auf <code>Animal</code>s beschränkt ist und dass alle <code>Animal</code>s und ihre Unterklassen eine <code>makeNoise()</code>-Methode enthalten ''müssen'', kann schon beim Programmieren sichergestellt werden, dass die <code>for</code>-Wiederholung problemlos durchlaufen wird.
== Ein echtes Beispiel ==
Die abstrakte Java-Klasse <code>JComponent</code> ist eine Oberklasse für alle sichtbaren Komponenten eines Programms wie Buttons, Slider, Fortschrittsbalken usw. Die abstrakte Oberklasse stellt sicher, dass alle Unterklassen Methoden wie <code>setFont()</code> oder <code>setVisible()</code> enthalten und sich alle vorhersehbar verhalten. Durch [[generische Programmierung]] können auch mehrere <code>JComponent</code>s z.B. zu einer <code>ArrayList</code> hinzugefügt werden und durch Iterieren über diese Liste alle nacheinander sichtbar oder unsichtbar geschaltet werden.
== Zum Weiterlesen ==
* [https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html Abstract Class im Java Tutorial {{Flagge|GB}}]
{{Navigationsleiste OOM}}
[[Kategorie:Objektorientierte Programmierung]]
[[Kategorie:Objektorientierte Programmierung]]
[[Kategorie:Programmierung]]
[[Kategorie:Programmierung]]

Aktuelle Version vom 14. Dezember 2023, 18:30 Uhr

Eine abstrakte Klasse ist eine besondere Art von Klasse.

Manche Klassen möchte man nicht direkt instanziieren können, sondern nur ihre Kinder. Dann kann man diese Klasse als abstrakt deklarieren.

Von abstrakten Klassen können nicht direkt Objekte erzeugt werden. Wenn man das möchte, muss man eine Unterklasse implementieren, die von der abstrakten Klasse erbt. Abstrakte Klassen dürfen neben normalen Methoden, die regulär vererbt werden, auch abstrakte Methoden enthalten, deren Methodenrumpf leer ist und deren Verhalten für jede Kind-Klasse einzeln definiert werden muss. Durch die Vererbung der Methoden bzw. wenigstens der Methoden-Schnittstellen kann mit einer abstrakten Klasse sichergestellt werden, dass alle ihrer Kind-Klassen ein vorhersehbares Verhalten aufweisen.

In UML-Klassendiagrammen werden abstrakte Klassen und Methoden durch kursive Schrift hervorgehoben.

Ein fiktives Beispiel

Der rechts dargestellte Quelltext als UML-Klassendiagramm
public abstract class Animal {
    
    // abstrakte Methode makeNoise -- jede Tierart macht ihr eigenes Geräusch
    public abstract void makeNoise();

    // Methode eat -- muss nicht von erbenden Klassen überschrieben werden.
    public void eat() {
        System.out.println("nom nom");
    }

}

public class Dog extends Animal {

    public void makeNoise() {
        System.out.println("woof!");
    }

}

public class Cat extends Animal {

    public void makeNoise() {
        System.out.println("meow!");
    }

    public void eat() {
        super.eat(); // ruft die eat()-Methode der Oberklasse auf
        wait();
        vomitAllOVerTheCarpet();
    }

}

In diesem Beispiel können keine Animal-Objekte mit dem Aufruf new Animal() erzeugt werden. Animal legt aber fest, dass alle Unterklassen wie Dog und Cat eine Methode namens makeNoise() enthalten müssen. Darauf aufbauend kann man nun z.B. eine Liste von Tieren anlegen:

public static void main(String[] args) {

    Cat felix = new Cat();
    Cat luna = new Cat();
    Dog milow = new Dog();
    Dog fiete = new Dog();

    ArrayList<Animal> zoo = new ArrayList<Animal>();
    zoo.add(felix);
    zoo.add(luna);
    zoo.add(milow);
    zoo.add(fiete);

    for(Animal a : zoo) {
        a.makeNoise();
    }
}

Zur ArrayList zoo dürfen nur Objekte hinzugefügt werden, die der Klasse Animal oder einer ihrer Unterklassen angehören. Die for-Wiederholung am Ende des Codeschnipsels erzeugt dann die folgende Ausgabe:

meow!
meow!
woof!
woof!

Dadurch, dass die ArrayList auf Animals beschränkt ist und dass alle Animals und ihre Unterklassen eine makeNoise()-Methode enthalten müssen, kann schon beim Programmieren sichergestellt werden, dass die for-Wiederholung problemlos durchlaufen wird.

Ein echtes Beispiel

Die abstrakte Java-Klasse JComponent ist eine Oberklasse für alle sichtbaren Komponenten eines Programms wie Buttons, Slider, Fortschrittsbalken usw. Die abstrakte Oberklasse stellt sicher, dass alle Unterklassen Methoden wie setFont() oder setVisible() enthalten und sich alle vorhersehbar verhalten. Durch generische Programmierung können auch mehrere JComponents z.B. zu einer ArrayList hinzugefügt werden und durch Iterieren über diese Liste alle nacheinander sichtbar oder unsichtbar geschaltet werden.

Zum Weiterlesen