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…“)
 
(Beispiele erweitert)
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.
 
== Ein fiktives Beispiel ==
<syntaxhighlight lang="java" line="1">
public abstract class Animal {
public abstract class Animal {
      
      
Zeile 29: Zeile 34:


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


Zeile 37: Zeile 42:


</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>
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.
== Zum Weiterlesen ==
* [https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html Abstract Class im Java Tutorial {{Flagge|GB}}]
[[Kategorie:Objektorientierte Programmierung]]
[[Kategorie:Objektorientierte Programmierung]]
[[Kategorie:Programmierung]]
[[Kategorie:Programmierung]]

Version vom 12. September 2023, 06:20 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.

Ein fiktives Beispiel

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.

Zum Weiterlesen