Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Abstract oder überhaupt nicht? (https://www.delphipraxis.net/74834-abstract-oder-ueberhaupt-nicht.html)

Neutral General 9. Aug 2006 12:24


Abstract oder überhaupt nicht?
 
Hi,

Ich hatte gestern das erste mal wirklich etwas mit abstracten Methoden zu tun :)
Ok ich hab sie auch schon zu spüren bekommen als ich versucht hatte mit einem TStream Daten auszulesen aber als es da gekracht hab, hat mich das eigentlich nur geärgert und ich hab nicht weiter drüber nachgedacht :mrgreen:

Naja ich frage mich jetzt:
Was ist der Vorteil von abstracten Methoden?

Man könnte die Methode doch in der Basisklasse einfach weglassen.. Die Nachfolger könnten sie doch einfach so hinzufügen und sie hätten sich das Length('override;') Zeichen gespart :mrgreen:
Das einzige etwas sinnvolle was mir einfällt ist das der Programmierer mehr oder weniger gezwungen ist abstracte Mehtoden in der Nachfolgeklasse auszufüllen weil es ansonsten halt kracht wenn man sie aufruft...

Wenn man will das die Methode in der Basisklasse leer ist dann könnte man sie doch theoretisch auch einfach virtual machen und sie leer lassen. Dann würde es wenigstens nicht krachen wenn man sie aufruft...

Also was ist jetzt der Vorteil?

Gruß
Neutral General

JasonDX 9. Aug 2006 12:39

Re: Abstract oder überhaupt nicht?
 
Zitat:

Zitat von Neutral General
Wenn man will das die Methode in der Basisklasse leer ist dann könnte man sie doch theoretisch auch einfach virtual machen und sie leer lassen. Dann würde es wenigstens nicht krachen wenn man sie aufruft...

Dass es kracht ist ein Vorteil. Das bedeutet naemlich, dass man bei der Implementierung etwas falsch gemacht hat.
Stell dir mal vor:
TStream deklariert Read(...) als virtuell, und implementiert eine leere Funktion.
TFileStream implementiert aber kein Read(...)
Wenn ich nun TFileStream.Read aufrufe, dann passiert nix - und es funktioniert auch nix. Durch abstract wird man (wie du erkannt hast) gezwungen, die Methode entweder zu deklarieren, oder weiterhin als abstract beizubehalten - durch denentsprechende Deklaration.
Die Fehlermeldung, die du erhaelst, zeigt dir, dass etwas nicht stimmt, und du kannst das Problem schnell lokalisieren. Wenn aber kein Fehler auftritt, und das Programm einfach nicht funktioniert (weil eben bspw. keine Daten aus TFileStream gelesen werden), dann sitzt man schon mal ein paar Stunden/Tage an der Fehlersuche ;)

greetz
Mike

Neutral General 9. Aug 2006 12:44

Re: Abstract oder überhaupt nicht?
 
Ja aber man könnte doch einfach abstracte Methoden weglassen und dem Programmierer überlassen ob er sie hinzufügt

mkinzler 9. Aug 2006 12:46

Re: Abstract oder überhaupt nicht?
 
Du bist gleichzeitig auf eine Besonderheit von Delphi gestossen, das nämlich das Anlegen von Instanzen von abstrakten Klassen erlaubt.
Abstrakte Methoden sind als Verpflichtung von abgeleiteten Klassen zur Implemnetierung zu verstehen. So kann eine übergeordnete Klasse eine Methode bereitstellen, welche dann von verschiedenenabgeleiteten Klassen verschieden implemnetiert wird.

Dax 9. Aug 2006 12:51

Re: Abstract oder überhaupt nicht?
 
Zitat:

Zitat von Neutral General
Ja aber man könnte doch einfach abstracte Methoden weglassen und dem Programmierer überlassen ob er sie hinzufügt

Wo bitte wäre dann der Sinn in der Basisklasse? :gruebel:

TStream und seine Methoden sind deshalb abstrakt, weil sie ein Interface darstellen sollen, mit dem man auf alle Streams zugreifen kann. Kuck dir mal die Indys an, die liefern in ihren Ereignissen auch TStreams, nicht TMemoryStreams - obwohl sie die intern benutzen.

mkinzler 9. Aug 2006 12:54

Re: Abstract oder überhaupt nicht?
 
@Neutral General: Lies dich mal in sie Grundlagen der OOP ein.

TBx 9. Aug 2006 12:56

Re: Abstract oder überhaupt nicht?
 
Das weglassen hätte große Nachteile.

Ich schreibe meine Daten z.B. gerne wahlweise in einen TMemorstream oder in einen TFilestream.

Meine Variable deklariere ich als TStream, weise Ihr aber entweder ein TFilestream oder ein TMemorystream zu.

Rufe ich nun das Read bzw. das Write der Variablen auf, wird automatisch die richtige Funktion/Prozedur, nämlich die der entsprechenden Childklasse angesprochen.

Hätte man Read und Write in der Basisklasse TStream nicht deklariert, so wäre das nicht möglich.

abstract wird eigentlich immer dann verwendet, wenn man einer Gruppe von Klassen eine Methode mitgeben möchte, die zwar bei allen Nachfahren das selbe Ziel hat (z.B.: schreiben und lesen) aber auf ganz unterschiedlichen Wegen funktionieren.

Hoffe, das bringt ein kleines bißchen licht ins Dunkel.

Gruß

onlinekater
[such]wo it er, der rote Katen...[/such]

Neutral General 9. Aug 2006 13:00

Re: Abstract oder überhaupt nicht?
 
Zitat:

Zitat von mkinzler
@Neutral General: Lies dich mal in sie Grundlagen der OOP ein.

erm..*hust* :roll:

Es tut mir leid wenn es jetzt so rübergekommen ist das ich kein OOP könnte.. *hust*
Ehhm.. Das war einfach nur eine Frage die mich beschäftigt hat. Weil man abstract ja eigentlich nicht brauch wenn man seine Klasse nur selbst verwendet.. Also was ich sagen will: Ich kann euch beruhigen ich bin mit den Grundlagen von OOP vertraut --- ___ ---

:roll: :roll: :roll: :wall:

EDIT: Thx ich denke ich habe jetzt den Sinn von abstract verstanden.. Hatte mir das vorher auch in etwa so gedacht ;)

TBx 9. Aug 2006 13:03

Re: Abstract oder überhaupt nicht?
 
also ich brauche abstract in meinen selbstverwalteten Klassen.
Eben aus den Gründen, die ich in meinem letzten Beitrag aufgezeigt habe.

Gruß

onlinekater

mkinzler 9. Aug 2006 13:04

Re: Abstract oder überhaupt nicht?
 
Zitat:

Es tut mir leid wenn es jetzt so rübergekommen ist das ich kein OOP könnte.
Ich kann dich beruhigen, so ist es nicht rübergekommen.
Zitat:

Das war einfach nur eine Frage die mich beschäftigt hat. Weil man abstract ja eigentlich nicht brauch wenn man seine Klasse nur selbst verwendet.
Dann barucht man es vielleicht nicht unbedingt, ich würde es aber trotzdem verwenden.
Zitat:

Ich kann euch beruhigen ich bin mit den Grundlagen von OOP vertraut --- ___ ---
Aber nicht mit dem Konzept von abstrakten klassen.


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

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