![]() |
Aufruf abstrakter Methode führt zu Fehler
Hallo Gemeinde,
ich verstehe das Folgende nicht, und hoffe ihr habt eine Idee: Es kommt zum Fehler beim Aufruf einer abstrakten Methode.
Delphi-Quellcode:
In meiner Oberklasse TFahrzeug habe ich zwei Methoden als Abstract deklariert, da sie erst im Nachfahren implementiert werden soll. Im Nachfahren habe ich diese Methoden mit OVERRIDE überschrieben und implementiert -- dennoch kracht es nun beim Aufruf einer dieser Methoden: 'Abstrakter Fehler'.
TFahrzeug = CLASS(TObject)
... PROCEDURE Verzoegern; VIRTUAL; ABSTRACT; // Fahrzeugabhängig, daher abstrakt. PROCEDURE Beschleunigen; VIRTUAL; ABSTRACT; // Fahrzeugabhängig, daher abstrakt. END; TPKW = CLASS(TFahrzeug) PRIVATE PROTECTED PUBLIC PROCEDURE Verzoegern; OVERRIDE; PROCEDURE Beschleunigen; OVERRIDE; Ich sehe auch keine Warnung im Sinne von 'a verdeckt b'. Jemand eine Idee, was ich da falsch mache? Vielen Dank Jazzman |
AW: Aufruf abstrakter Methode führt zu Fehler
Welchen Vorteil erwartest Du denn von dem ABSTRACT ? Lasse das weg und mache leere Methode, die erst später konkret besetzt wird.
|
AW: Aufruf abstrakter Methode führt zu Fehler
Zitat:
Delphi-Quellcode:
in den Implementierungen auf? (auch wenn das keinen Sinn macht)
inherited Methodenname;
Folgendes Beispiel funktioniert solange man nicht ABSTRACTERROR definiert.
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {.$DEFINE ABSTRACTERROR} uses SysUtils; type TFahrzeug = class(TObject) procedure Verzoegern; virtual; abstract; procedure Beschleunigen; virtual; abstract; end; TPKW = class(TFahrzeug) public procedure Verzoegern; override; procedure Beschleunigen; override; end; { TPKW } procedure TPKW.Beschleunigen; begin inherited {$IFDEF ABSTRACTERROR}Beschleunigen{$ENDIF}; asm nop end; end; procedure TPKW.Verzoegern; begin inherited {$IFDEF ABSTRACTERROR}Verzoegern{$ENDIF}; asm nop end; end; var Fahrzeug: TFahrzeug; begin try Fahrzeug := TPKW.Create; try Fahrzeug.Beschleunigen; Fahrzeug.Verzoegern; finally Fahrzeug.Free; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; ReadLn; end. |
AW: Aufruf abstrakter Methode führt zu Fehler
Zitat:
Darüber muß ich nochmal nachdenken. :gruebel: Jazzman |
AW: Aufruf abstrakter Methode führt zu Fehler
Zitat:
Den Rest (Beispiel) verstehe ich nicht. :pale: Trotzdem Danke Jazzman |
AW: Aufruf abstrakter Methode führt zu Fehler
Zitat:
Wenn man eine Klasse schreibt, deren Elternklasse TPerson die abstrakte Methode aufDenKopfStellen hat, sollte man diese Methode implementieren, denn irgendwo gibt es Code, der sich darauf verlässt, das sich das Objekt auf den Kopf stellt (egal wie es das anstellt!), wenn diese Methode aufgerufen wird. Wenn die Methode in der Elternklasse einfach leer gelassen würde, wäre das nicht ersichtlich. So würde der Code, der dem TPerson-Objekt ein paar warme TSocken anziehen soll, diesem die eventuell über die Ohren ziehen, weil sich das Objekt nicht ordnungsgemäß mit den Füßen nach oben auf den Kopf gestellt hat :drunken: Und das würdest du beim Kompilieren dann nicht merken. |
AW: Aufruf abstrakter Methode führt zu Fehler
Zeig mal den Methodenaufruf. Bist du dir sicher, dass du das richtige Objekt instanziiert hast und die richtige Methode aufrufst?
mfg Christian |
AW: Aufruf abstrakter Methode führt zu Fehler
Zitat:
Deshalb mein Vorschlag, die Methode als leeren Rumpf zur Verfügung zu stellen und nicht nur zu deklarieren. Unterschied ist :
Delphi-Quellcode:
und
virtual; abstract
Delphi-Quellcode:
machen beide nichts, was nicht implementiert ist. Kommt "abstract" zusätzlich ins Spiel, dann wird wie gesagt, nichts gemacht, ausser zusätzlich eine Fehlermeldung zu produzieren.
virtual;
|
AW: Aufruf abstrakter Methode führt zu Fehler
Ich glaube, ich habe mich etwas schwammig ausgedrückt.
Zitat:
Wenn ich einen abstrakten Fehler bekomme, habe ich dann die Wahl:
Ohne abstract hätte ich nicht mitgekriegt, das überhaupt etwas schief laufen könnte. |
AW: Aufruf abstrakter Methode führt zu Fehler
Zitat:
Eine Art Documentation by Design |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr. |
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 by Thomas Breitkreuz