Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klassen (https://www.delphipraxis.net/121617-sinn-nutzen-und-einsatzmoeglichkeit-von-abstrakten-klassen.html)

Luckie 1. Okt 2008 11:45


Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klassen
 
Wir machen in der Berufsschule gerade Java. Ich bringe mir allerdings so ein paar Dinge im Selbststudium bei, weil mir das in der Schule nicht tief genug geht und auch nicht schnell genug. Zur zeit bin ich gerade beim Thema "Vererbung" und "abstrakte Klassen". Die abstrakten Klassen kenne ich natürlich schon aus Delphi, allerdings habe ich mir bisher wohl noch nie richtig Gedanken gemacht, was für einen Nutzen sie haben und wo man sie einsetzt. Könntet ihr mir diesbezüglich etwas helfen?

Apollonius 1. Okt 2008 11:49

Re: Siin, Nutzen und Einsatzmöglichkeit von abstrakten Klass
 
Das Beispiel, welches in den meisten Tutorials verwendet wird, handelt von einer Sammlung von Graphikobjekten. TCircle, TRectangle, TImage und so weiter werden von einer Klasse TGraphic abgeleitet und überschreiben deren Paint-Methode. In TGraphic gibt es jedoch keine sinnvolle Implementierung der Paint-Methode, es ist sogar ein Fehler, diese aufzurufen. Daher sollte sie als abstrakt gekennzeichnet werden. In Java geht man sogar noch einen Schritt weiter: Wenn man TGraphic.Paint nicht aufrufen darf, ergibt es keinen Sinn, überhaupt ein Objekt der Klasse TGraphic zu erzeugen. Die Klasse ist daher abstrakt.

Etwas realistischere Beispiele sind Threads oder Aufträge. Letztere werden in Java mit Interfaces (Runable und Callable) implementiert, welche ja letztlich eine konsequente Erweiterung von abstrakten Klassen sind.

Jelly 1. Okt 2008 11:52

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
 
Man kann eine abstrakte fast mit einem Interface vergleichen. Die abstrakte Klasse selbst kannst du nicht erzeugen, du kannst aber innerhalb der abstrakten Definition irgendwelche Methoden aus der abstrakten Klasse aufrufen. Allerdings implementieren MUSST du sie (genau wie bei Interfaces) in der abgeleiteten Klasse. Damit zwingst du auch den Programmierer, sich im Team an gewisse Konventionen zu halten.

Deine Instanzvariablen dürfen aber natürlich weiterhin vom Typ deiner abstrakten Klasse sein. Nur darfst du nicht dessen Konstruktor direkt aufrufen sondern den aus der abgeleiteten Klasse.

Bis dahin seh ich also keinen grossen Unterschied zu einem Interface.

Der Unterschied zum Interface ist der, dass du mehrere Interfaces definieren kannst, die eine Klasse implementieren muss, und du diese Klasse über jeden dieser Interfaces ansprechen kannst. Damit immitierst du eine Art Mehrfachvererbung.

Apollonius 1. Okt 2008 11:55

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
 
Noch andere Unterschiede zu Interfaces: Man kann einige Methoden bereits implementieren und Felder deklarieren. Außerdem sind abstrakte Klassen meist performanter, gerade in Java kann sich das durchaus bemerkbar machen.

Luckie 1. Okt 2008 11:56

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
 
@Appolonius: dann könnte ich doch einfach bei TGraphic die Paint Methode weglassen, so dass jede abgeleitete Klasse sie selber implementieren muss. Wozu dann eine abstrakte Methode, wenn die abgeleiteten Klassen sie doch selber implementieren müssen? Warum deklariere ich sie denn dann erst in der übergeordneten Klasse?

Apollonius 1. Okt 2008 11:58

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
 
Wie würdest du dann eine Liste von Graphikobjekten implementieren, die du alle zeichnen lassen kannst?

nachti1505 1. Okt 2008 12:02

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
 
Zitat:

Zitat von Luckie
...wenn die abgeleiteten Klassen sie doch selber implementieren müssen...

Das "müssen" definierst du in der abstrakten Klasse.

Phoenix 1. Okt 2008 12:08

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
 
Zitat:

Zitat von Luckie
Warum deklariere ich sie denn dann erst in der übergeordneten Klasse?

Einfach, damit Du sie auf der Basisklasse aufrufen kannst.
Will heissen, Du lässt Dir von einer factory eine konkrete Instanz einer Ableitung von TGraphic zurückgeben, benutzt aber eine Referenz auf TGraphic. Wenn Du sie nicht in der abstrakten Basisklasse deklarieren würdest, könntest Du die Paint-Methode gar nicht aufrufen, ohne auf die jeweilige Konkrete Klasse zu casten.

Codewalker 1. Okt 2008 12:46

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
 
Wie wäre es mit einem Beispiel:

Wir wollen verschiedene geometrische Figuren (Dreieck, Quadrat, Kreis) verwalten und deren Fläche berechnen können. Die Klassen sollen TDreieck, TQuadrat und TKreis heißen und eine Funktion function BerechneFlaeche(): Double soll bei jeder der Klassen den Flächeninhalt berechnen. Natürlich hat jede Klasse andere Attribute (TKreis hat einen Radius, etc.). Wenn wir jetzt alle drei von einer Klasse TGeometrischeFigur ableiten, könnten wir also beliebige Kreise, Dreiecke, etc. in einem gemeinsamen array of TGeometrischeFigur verwalten. Um noch die Fläche berechnen zu können, muss TGeometrischeFigur logischerweise die Funktion BerechneFlaeche implementieren.
Und hier macht es dann keinen Sinn mehr, weil man ja nicht weiß, was man zu berechnen hat. Also kommt das abstrakte ins Spiel. Damit zwingst du (wie oben beschrieben) den Programmierer dazu, die Funktion BerechneFlaeche in jeder abgeleiteten Klasse zu implementieren und kannst sie gleichzeitig (Polymorphismus sei dank) direkt über den Array-Eintrag vom Typ TGeometrischeFigur aufrufen (es wird natürlich jeweils die Richtige aufgerufen). Und da eine Instanz von TGeometrischeFigur hier weitgehend sinnfrei wäre, kann man halt auch die gesamte Klasse als abstrakt kennzeichnen, um das unfreiwillige instanziieren zu unterbinden.

Korrigiert mich, wenn ich Blödsinn geschrieben habe :mrgreen:

Luckie 1. Okt 2008 12:49

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
 
Ich glaube, so langsam wird mir das Konzept klar.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz