[C++]Abstrakte Klassen

07/05/2012 20:23 Terreox#1
Hallo zusammen.

bin heute beim Durchblättern durch ältere Kapitel meines C++ Buches auf Abstrakte Klassen gestoßen. Hab das Kapitel wahrscheinlich nicht besonders gründlich gelesen, weil mir der Begriff nicht geläufig war.
Habs mir also mal durchgelesen und habe dazu eine Verständnisfrage.
Wofür werden abstrakte Klassen benötigt? Ist es sozusagen eine Klasse mit verallgemeinerten Funktionen, die von "gleichartigen" abgeleiteten Klassen benutzt wird quasi wie ein Template ohne Funktion?(ich finds ein wenig umständlich zu erklären).
Sprich, man hat eine abstrakte Klasse "Frucht" mit den rein-virtuellen Funktionen farbe(), geschmack(), gattung() und leitet davon "Birne", "Apfel" und "Himbeere" ab, die alle diese drei virtuellen Funktionen definieren müssen, bevor man die abgeleitete Klasse dann instanzieren kann?

Hat vielleicht jemand weitere Anwendungsbeispiele? Kann mir solche abstrakten Funktionen irgendwie momentan nur in riesigen Programmen mit vielen gleichartigen Klassen vorstellen.
07/05/2012 20:36 MrSm!th#2
Du hast es eigentlich schon treffend beschrieben.
Abstrakte Klassen werden hauptsächlich als Interfaces benutzt, d.h. um einem Anwender eine Schnittstelle zu bieten, die er verwenden kann.
Allerdings ist die Implementierung davon abgekapselt, d.h. jeder kann sie im Grunde neu implementieren und dem Benutzer übergeben und er kann die neue Version aufgrund der gleichen Schnittstelle trotzdem verwenden.

DirectX ist das perfekte Beispiel, dort ist jede Klasse abstrakt und bietet quasi in Interface zu einem Objekt, bspw. einem Text Font.
Sie bietet halt allerlei Methoden zum Zeichnen und manipulieren von Textausgabe. Wie das ganze aber implementiert ist, siehst du nicht.
Für verschiedene Systeme und verschiedene DX Versionen (oder bei hardwarenäheren Objekten sogar für unterschiedliche Hardware/Treiber) gibt es unterschiedliche Versionen.
GUI Frameworks sind auch bekannte Beispiele, die halt abstrakte Fenster Klassen bieten, die dann für jedes OS entsprechend implementiert werden können, ohne, dass sich der Anwender des FWs damit rumschlagen muss.

Im Informatikunterricht bekommt man es häufig am Beispiel von Container Klassen gezeigt: Es gibt das Interface List, das zahlreiche Methoden zum Verwalten von Listen bietet.
Nun kann man diese mit Arrays, mit LinkedLists, HashTables und vielem mehr implementieren, die man halt von List ableitet.
D.h. einem List Pointer kann ein LinkedList Pointer zugewiesen werden, aber dir als Anwender kann völlig egal sein, was sich nun dahinter verbirgt, da die Abstraktheit dir die Möglichkeiten, die das Interface hat, garantiert. Würde irgendeine Kindklasse die Methoden nämlich nicht implementieren, würde sie automatisch auch abstrakt und könnte nicht instanziert werden.

In der Praxis gibt es häufig sogenannte Factory Funktionen/Klassen, die dir einen Pointer auf ein Interface zurückliefern (so läuft es quasi mit jedem DX Objekt ab).
Was für eine Kindklasse sie dem Pointer zugewiesen haben und wie das ganze implementiert ist, interessiert dich nicht und muss es auch nicht.


TL;DR:

Abstrakte Klassen bieten, wie der Name schon sagt, die Möglichkeit, Schnittstelle von Implementation zu abstrahieren.
07/05/2012 21:26 Terreox#3
würd dir ja gerne mehr als 1 thanks geben :) danke für die ausführliche erklärung!
07/06/2012 08:27 xNopex#4
Schau dir mal ein paar design patterns durch. Da werden häufig abstrakte Klassen verwendet. Als Beispiel mal folgendes: Kompositum (Entwurfsmuster)

Gibt ein paar Anregungen wozu man das noch so brauchen kann :)