Programmierung: Abstrakte Klassen

vom 04.04.2009, 13:42 Uhr

In einem anderen Bericht habe ich etwas zu Interfaces geschrieben, diese stellen anderen Klassen Signaturen von Funktionen bereit und können zur Mehrfachvererbung, sowie der Festlegung von Eigenschaften benutzt werden.

Eine andere Möglichkeit Eigenschaft vorzudefinieren ist mittels abstrakter Klassen. Abstrakte Klassen stellen auch Signaturen von Funktionen bereit, können aber auch Code beinhalten. Was mit abstrakten Klassen jedoch oft nicht möglich ist, ist die Funktion der Mehrfachvererbung. In Java und C# zum Beispiel kann man dafür lediglich Interfaces benutzen.

Ein großer Vorteil an abstrakten Klassen ist jedoch die eben erwähnte Möglichkeit, Funktionen auch schon zu implementieren. So ist es möglich, Basisoperationen der abstrakten Klasse beizubringen. Die erbenden Klassen brauchen dann lediglich die Operationen implementieren, die die Basisklasse (die abstrakte Klasse) noch nicht implementiert hat.

Ein Beispiel dazu wäre von mir eine abstrakte Klasse Auto. Diese abstrakte Klasse bietet die Funktionen Fahren, Bremsen und Beschleunigen. Die Funktionen Fahren und Bremsen kann man dabei bereits in der abstrakten Klasse implementieren, da unsere Autos alle gleich fahren sollen und auch gleich bremsen sollen. Die Beschleunigung jedoch lassen wir abstrakt, das bedeutet, dass die erbende Klasse diese implementieren muss, so haben wir einmal die Klasse LangsamesAuto, dieses implementiert Beschleunigen als langsame Beschleunigung und die Klasse SchnellesAuto, welche Beschleunigung als schnelle Beschleunigung implementiert.

Der Vorteil besteht ganz klar darin, dass man für LangsamesAuto und SchnellesAuto nicht auch noch den Code für Fahren und Bremsen schreiben muss oder noch schlimmer durch copy&paste übernehmen muss. So entsteht doppelter Code und wenn man einen Fehler im Fahren gefunden hat, müsste man andernfalls in beiden Klassen den Code ändern, so hat man diese Methoden bei zentralen Klassen zentral.

Ich freu mich auf Antworten auf diesen Thread, benutzt ihr abstrakte Klassen? Wie sind eure Erfahrungen damit. In welchen Sprachen benutzt ihr sie?

» Xelluloid » Beiträge: 119 » Talkpoints: -1,01 » Auszeichnung für 100 Beiträge



Bisher habe ich abstrakte Basisklassen noch nicht verwendet, weil es in meinen Programmen nicht sinnvoll war, diese Technik einzusetzen.

Ich habe aber ein Programm in Planung (Sprache C# oder VB.Net), das höchstwahrscheinlich eine abstrakte Basisklasse enthalten wird. Dieses Programm soll eine Lernsoftware werden, bei welcher die Schüler gegen verschiedene Tiere rechnen sollen. Zunächst rechnet man gegen ein Schaf, dann gegen eine Möwe, usw. Die Tiere werden immer besser und schneller im Rechnen. Der "Endgegner" wird ein Löwe sein. Wenn der Schüler besser als der Löwe rechnen kann, wird er zum Rechenkönig ernannt.

Nun könnte die abstrakte Basisklasse bei diesem Programm "Animal" heißen. In der abstrakten Basisklasse könnten Eigenschaften implentiert werden, welche jedes Tier haben soll. Zum Beispiel soll jedes Tier die Eigenschaft "Name" haben. Für jedes Tier kann nun eine Klasse erstellt, welche von der Klasse "Animal" erbt und eigene Methoden implentiert.

Wie findest du diesen Ansatz. Ist bei diesem Programm eine abstrakte Basisklasse "Animal" sinnvoll oder würdest du einen anderen Ansatz vorschlagen?

» kengi » Beiträge: 886 » Talkpoints: 17,93 » Auszeichnung für 500 Beiträge


Definitiv ist das ein Musterbeispiel für Vererbung. Vor allem macht es auch Sinn die Klasse Animal als abstrakte Basisklasse zu definieren, wenn man selbst keine Instanz eines Animals haben will, sondern eher Instanzen von Möwe und Löwe. Dennoch kann das Programm dann eine Liste von Animals beinhalten und auch auf alle Eigenschaften des Animals zurückgreifen.

Das Programm braucht nicht zu wissen, um welches Animal es sich handelt, es kümmert sich nur um die Funktionen und Eigenschaften des Animals.

Ein sehr schönes Beispiel, wie ich finde. Wenn man doch wissen möchte, um welches Animal es sich handelt, kann man der abstrakten Klasse ja eine Enumeration Typ hinzufügen. In der Klasse Löwe gibt man dann bei einer Abfrage des Typs Löwe zurück. Ich würde wohl ebenso an die Sache herangehen.

» Xelluloid » Beiträge: 119 » Talkpoints: -1,01 » Auszeichnung für 100 Beiträge



Ähnliche Themen

Weitere interessante Themen

^