<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://demowiki.knowlus.com/index.php?action=history&amp;feed=atom&amp;title=Abstrakte_Klasse</id>
	<title>Abstrakte Klasse - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://demowiki.knowlus.com/index.php?action=history&amp;feed=atom&amp;title=Abstrakte_Klasse"/>
	<link rel="alternate" type="text/html" href="https://demowiki.knowlus.com/index.php?title=Abstrakte_Klasse&amp;action=history"/>
	<updated>2026-05-18T07:33:42Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Demo Wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://demowiki.knowlus.com/index.php?title=Abstrakte_Klasse&amp;diff=13883&amp;oldid=prev</id>
		<title>imported&gt;RolandIllig: /* Geometrie */ typo</title>
		<link rel="alternate" type="text/html" href="https://demowiki.knowlus.com/index.php?title=Abstrakte_Klasse&amp;diff=13883&amp;oldid=prev"/>
		<updated>2023-01-28T21:15:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Geometrie: &lt;/span&gt; typo&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Eine &amp;#039;&amp;#039;&amp;#039;abstrakte Klasse&amp;#039;&amp;#039;&amp;#039; bezeichnet in der [[Objektorientierte Programmierung|objektorientierten Programmierung]] eine spezielle [[Klasse (Programmierung)|Klasse]], welche sich per Definition nicht instanziieren lässt, d.&amp;amp;nbsp;h., es lassen sich keine [[Objekt (Programmierung)|Objekte]] von ihr erzeugen, und dient somit lediglich als Strukturelement innerhalb einer Klassenhierarchie. Innerhalb von abstrakten Klassen besteht die Möglichkeit, abstrakte Methoden, also [[Methode (Programmierung)|Methoden]] ohne Implementierung nur mit der [[Signatur (Programmierung)|Signatur]], zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
[[Schnittstelle (Programmierung)|Schnittstellen]] sind rein abstrakte [[Klasse (Objektorientierung)|Klassen]], die nur Methodensignaturen deklarieren. Eine Klasse gilt dagegen bereits als abstrakt, sobald eine Methode vorhanden ist, die durch eine [[Vererbung (Programmierung)|erbende]] Klasse implementiert werden muss. In einer abstrakten Klasse können auch [[Variable (Programmierung)|Variablen]] definiert und [[Methode (Programmierung)|Methoden]] implementiert werden.&lt;br /&gt;
&lt;br /&gt;
Als [[Basisklasse|Basisklassen]] in einer Klassenhierarchie können abstrakte Klassen grundlegende Eigenschaften ihrer [[Abgeleitete Klasse|abgeleiteten Klassen]] festlegen, ohne diese bereits konkret zu implementieren. Leitet eine [[Klasse (Objektorientierung)|Klasse]] von einer abstrakten Klasse ab, müssen alle [[Vererbung (Programmierung)|vererbten]] abstrakten [[Methode (Programmierung)|Methoden]] überschrieben und implementiert werden, damit die erbende Klasse selbst nicht abstrakt ist.&lt;br /&gt;
&lt;br /&gt;
Abstrakte Klassen können nicht selbst instanziiert werden, nur Spezialisierungen von diesen. Dennoch können Teile des [[Quelltext]]es allgemein gehalten und nur unter Verwendung der Eigenschaften des abstrakten Basistyps implementiert werden. Durch [[Polymorphie (Programmierung)|Polymorphie]] kommen dabei die speziellen Implementierungen der nicht abstrakten [[Abgeleitete Klasse|abgeleiteten Klassen]] zur Ausführung.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Geometrie ===&lt;br /&gt;
Zweidimensionale [[Figur (Geometrie)|geometrische Figuren]] haben gemeinsam, dass sie über einen [[Flächeninhalt]] verfügen. Je nach Figur wird dieser Flächeninhalt aber unterschiedlich berechnet.&lt;br /&gt;
&lt;br /&gt;
Wird eine abstrakte [[Basisklasse]] namens &amp;lt;code&amp;gt;Geometrisch&amp;lt;/code&amp;gt; angelegt, kann mit einem Methodenrumpf für eine Funktion &amp;lt;code&amp;gt;berechneFlaecheninhalt&amp;lt;/code&amp;gt; festgelegt werden, dass alle [[Abgeleitete Klasse|abgeleiteten Klassen]] eine entsprechende [[Methode (Programmierung)|Methode]] implementieren müssen. Zum Beispiel wird eine [[Klasse (Objektorientierung)|Klasse]] &amp;lt;code&amp;gt;Rechteck&amp;lt;/code&amp;gt; die Länge mit der Breite multiplizieren, in einer Klasse &amp;lt;code&amp;gt;RechtwinkligesDreieck&amp;lt;/code&amp;gt; wird die Länge mit der Höhe multipliziert und das Produkt halbiert.&lt;br /&gt;
&lt;br /&gt;
Durch die Klassenhierarchie mit einer abstrakten [[Basisklasse]] hat man sich die Möglichkeit eröffnet, andernorts Funktionen zu erstellen, die ein Objekt vom Typ &amp;lt;code&amp;gt;Geometrisch&amp;lt;/code&amp;gt; entgegennehmen und auf ihm die Funktion &amp;lt;code&amp;gt;berechneFlaecheninhalt&amp;lt;/code&amp;gt; aufrufen, völlig unabhängig davon, ob es sich um [[Dreieck|Dreiecke]], [[Rechteck|Rechtecke]] oder [[Kreis|Kreise]] handelt. Die Funktionen sind somit für sämtliche [[Geometrische Figur|geometrischen Figuren]] nutzbar und weisen einen hohen Grad an Flexibilität und Wiederverwendbarkeit auf.&lt;br /&gt;
&lt;br /&gt;
==== Programmbeispiel ====&lt;br /&gt;
Die folgenden Beispiele sind in der [[Programmiersprache]] [[Java (Programmiersprache)|Java]] geschrieben. Als [[Datentyp]] wird eine [[Gleitkommazahl]] &amp;#039;&amp;#039;double&amp;#039;&amp;#039; verwendet.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;A.&amp;#039;&amp;#039;&amp;#039; Die Definition der [[Schnittstelle (Objektorientierung)|Schnittstelle]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public interface Geometrisch&lt;br /&gt;
{&lt;br /&gt;
    public abstract double berechneFlaecheninhalt();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;B.&amp;#039;&amp;#039;&amp;#039; Erstellen einer [[Basisklasse]] für Höhen- und Längenangabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public abstract class BasisFigur implements Geometrisch&lt;br /&gt;
{&lt;br /&gt;
    double laenge;&lt;br /&gt;
    double hoehe;&lt;br /&gt;
	&lt;br /&gt;
	// Konstruktor&lt;br /&gt;
    public BasisFigur(final double LAENGE, final double HOEHE)&lt;br /&gt;
    {&lt;br /&gt;
        laenge = LAENGE;&lt;br /&gt;
        hoehe = HOEHE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getLaenge()&lt;br /&gt;
    {&lt;br /&gt;
        return laenge;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setLaenge(final double LAENGE)&lt;br /&gt;
    {&lt;br /&gt;
        laenge = LAENGE;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getHoehe()&lt;br /&gt;
    {&lt;br /&gt;
        return hoehe;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void setHoehe(final double HOEHE)&lt;br /&gt;
    {&lt;br /&gt;
        hoehe = HOEHE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;C.&amp;#039;&amp;#039;&amp;#039; Beispielhafte Implementierung einer &amp;#039;&amp;#039;konkreten&amp;#039;&amp;#039; Figur &amp;#039;&amp;#039;&amp;#039;Rechteck&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Rechteck extends BasisFigur&lt;br /&gt;
{&lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Rechteck(final double LAENGE, final double HOEHE)&lt;br /&gt;
    {&lt;br /&gt;
        super(LAENGE, HOEHE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public double berechneFlaecheninhalt()&lt;br /&gt;
    {&lt;br /&gt;
        return getLaenge() * getHoehe();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;D.&amp;#039;&amp;#039;&amp;#039; Beispielhafte Implementierung einer weiteren &amp;#039;&amp;#039;konkreten&amp;#039;&amp;#039; Figur &amp;#039;&amp;#039;&amp;#039;rechtwinkliges Dreieck&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class RechtwinkligesDreieck extends BasisFigur&lt;br /&gt;
{&lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public RechtwinkligesDreieck(final double LAENGE, final double HOEHE)&lt;br /&gt;
    {&lt;br /&gt;
        super(LAENGE, HOEHE);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public double berechneFlaecheninhalt()&lt;br /&gt;
    {&lt;br /&gt;
        return (getLaenge() * getHoehe()) / 2;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;E.&amp;#039;&amp;#039;&amp;#039; Eine Beispielklasse zur erweiterten Verwendung, welche [[Verknüpfung (Mathematik)|Operationen]] auf Basis der [[Schnittstelle (Objektorientierung)|Schnittstelle]] ausführt:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class GeometrischerRechner&lt;br /&gt;
{&lt;br /&gt;
    public static double berechneGesamtFlaecheninhalt(final Geometrisch[] figuren)&lt;br /&gt;
    {&lt;br /&gt;
        double ergebnis = 0;&lt;br /&gt;
        for (Geometrisch figur : figuren)&lt;br /&gt;
        {&lt;br /&gt;
            ergebnis += figur.berechneFlaecheninhalt();&lt;br /&gt;
        }&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;F.&amp;#039;&amp;#039;&amp;#039; Beispiel einer Ausführung liefert die folgende [[Klasse (Objektorientierung)|Klasse]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class GeometrischesFigurenBeispiel&lt;br /&gt;
{&lt;br /&gt;
    public static void main(String[] args)&lt;br /&gt;
    {&lt;br /&gt;
        // 1.1. Erstellung einzelner Objekte&lt;br /&gt;
        Geometrisch rechteck = new Rechteck(10, 20);&lt;br /&gt;
        Geometrisch dreieck = new RechtwinkligesDreieck(10, 20);&lt;br /&gt;
		&lt;br /&gt;
        // 1.2. Separate Berechnung der Flächeninhalte&lt;br /&gt;
        System.out.println(&amp;quot;Rechtecksfläche: &amp;quot; + rechteck.berechneFlaecheninhalt());&lt;br /&gt;
        System.out.println(&amp;quot;Dreiecksfläche: &amp;quot; + dreieck.berechneFlaecheninhalt());&lt;br /&gt;
		&lt;br /&gt;
        // 2.1. Parameter für die Übergabe an GeometrischerRechner&lt;br /&gt;
        Geometrisch[] figuren = new Geometrisch[]{rechteck, dreieck};&lt;br /&gt;
		&lt;br /&gt;
        // 2.2. Berechnung und Ausgabe der Gesamtfläche&lt;br /&gt;
        System.out.println(&amp;quot;Gesamtfläche: &amp;quot; + GeometrischerRechner.berechneGesamtFlaecheninhalt(figuren));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;G.&amp;#039;&amp;#039;&amp;#039; Wird dieses [[Computerprogramm|Programm]] übersetzt und ausgeführt, so erscheint in der Konsole die folgende Ausgabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
  Rechtecksfläche: 200.0&lt;br /&gt;
  Dreiecksfläche: 100.0&lt;br /&gt;
  Gesamtfläche: 300.0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel für den Datenbankzugriff ===&lt;br /&gt;
Ein klassisches Beispiel für die Anwendung abstrakter Klassen kommt aus dem Bereich der [[Datenbank]]-Anwendung. Sämtliche [[Methode (Programmierung)|Methoden]] für den Zugriff auf die Datenbank werden in einer abstrakten Klasse definiert. Für jeden Datenbank-Typ kann eine konkrete [[Klasse (Objektorientierung)|Klasse]] programmiert werden, die alle [[Vererbung (Programmierung)|geerbten]] Zugriffsmethoden implementiert. In der Anwendung muss an einer einzigen Stelle die konkret implementierte Klasse bekannt sein – dort wird das [[Objekt (Programmierung)|Objekt]] erzeugt. Anschließend wird es im gesamten restlichen [[Programmcode]] als Objekt vom Typ der abstrakten Klasse behandelt.&lt;br /&gt;
&lt;br /&gt;
Die konkrete [[Klasse (Objektorientierung)|Klasse]] kann als Eigenschaft, einer sogenannten &amp;#039;&amp;#039;Property&amp;#039;&amp;#039;, in einer [[Datei]] außerhalb des [[Programmcode|Programmcodes]] angegeben werden. So ist kein erneutes Übersetzen nach ausgetauschter [[Datenbank]] nötig und es entsteht eine hohe Wiederverwendbarkeit der Applikation.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html Abstract Methods and Classes]&lt;br /&gt;
* [https://www.w3schools.com/java/java_abstract.asp Java Abstract Classes and Methods]&lt;br /&gt;
* [https://www.geeksforgeeks.org/abstract-classes-in-java/ Abstract Classes in Java]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Objektorientierte Programmierung]]&lt;br /&gt;
&lt;br /&gt;
[[sv:Klass (programmering)#Abstrakt klass]]&lt;/div&gt;</summary>
		<author><name>imported&gt;RolandIllig</name></author>
	</entry>
</feed>