![]() |
AW: Aufruf abstrakter Methode führt zu Fehler
:thumb:
|
AW: Aufruf abstrakter Methode führt zu Fehler
Und noch mehr: Man erhält i.d.R. eine Warnung zur Compiletime (in anderen Sprachen sogar einen Fehler). Das hilft Bugs gar nicht erst entstehen zu lassen.
Das mit den leeren Methoden kann auch seinen Sinn haben. Wenn diese von anderen (nicht abstrakten) Methoden aufgerufen werden, wären das dann so genannte HookMethods. Also quasi Stellen, in die ich Code einfügen kann, aber nicht muss. Abstrakte Methoden sind hingegen eher TemplateMethods. Hier *muss* ich etwas implementieren. Beides braucht man oft, wenn man n Framework schreibt. Abstrakte Methoden, die nicht unbedingt intern aufgerufen werden, gibt es auch sehr oft in Klassen, die die Anwendungsdomäne modellieren. In leeren Methoden, die keine HookMethoden sind, sehe ich momentan keinen sonderlichen Sinn. Fällt euch einer ein? Fakt ist, dass die Exception "Abstrakter Fehler" auf einen Bug hindeutet. Man könnte die Exception unterdrücken, wenn man ne leere Methode dafür einsetzt. Der eigentliche Bug wird dadurch aber nicht behoben... mfg Christian |
AW: Aufruf abstrakter Methode führt zu Fehler
Eine relativ simple Klasse die man sich als Beispiel dazu anschauen kann ist
![]() ![]() |
AW: Aufruf abstrakter Methode führt zu Fehler
Zitat:
Zitat:
Delphi-Quellcode:
Alternative : nur "abstract" deklarieren und es kommt das:
showmessage ('Funktion kommt mit nächster Version');
Zitat:
|
AW: Aufruf abstrakter Methode führt zu Fehler
@Hansa ich weiß nicht wo du bist, wir sprechen hier über virtal abstract und da gibt es einen Compiler-Fehler wenn nicht deklariert wurde.
Vielleicht hast du dich ja im Thread geirrt Ach, das mit der Dokumentation meine ich nicht als Doku für den Enduser sondern für den Entwikler der eine Basisklasse erweitern möchte/soll/muss. |
AW: Aufruf abstrakter Methode führt zu Fehler
Zitat:
Delphi-Quellcode:
ABSTRACT alleine geht überhaupt nicht !
type
TKlasse1 = class procedure test; virtual; abstract; end; TKlasse2 = class (TKlasse1) procedure test; end; var Klasse1 : TKlasse1; Klasse2 : TKlasse2; Zitat:
Delphi-Quellcode:
aber nicht deklariert ist (in der Klassen-Definition), dann ist die Prozedur erstens "unknown identifier" und zusätzlich kommt noch "Ungenügende Forward- oder External-Deklaration". Ist die Prozedur deklariert mit ABSTRACT, dann reicht das. Mehr geht nicht mal (insbesondere keine konkrete Implementierung). Dann kommt nämlich hier :
type
TKlasse1 = class procedure test; virtual; abstract; end; var Klasse1 : TKlasse1; procedure TKlasse1.UndeklarierteImplementierung; begin end;
Delphi-Quellcode:
dieser Compilerfehler :
procedure TKlasse1.test;
begin ShowMessage(''); end; Zitat:
Delphi-Quellcode:
nicht implementiert werden, man kann im Programm trotzdem auf diese Prozedur zugreifen und produziert damit erst zur Laufzeit einen Fehler. Trotz des Fehlers lässt sich eine EXE erstellen, die lauffähig ist und eben Fehlermeldungen produziert. So richtig nach dem Motto : "es compiliert, wir können ausliefern". :mrgreen:
procedure TKlasse1.Test;
|
AW: Aufruf abstrakter Methode führt zu Fehler
Hallo,
bei neueren Delphi-IDEs kann man Warnungen des Compilers über die Projektoptionen in Fehlermeldungen umwandeln (Delphi-Compiler -> Hinweise und Warnungen: "Ausgabewarnungen"). Für ältere IDEs stellen die ![]() Gruß Hawkeye |
AW: Aufruf abstrakter Methode führt zu Fehler
Hansa's Ansatz bedeutet einfach: "Die Methode kannst Du überschreiben, musst Du aber nicht". Der 'abstract' Ansatz bedeutet einfach: "Du musst die Methode noch überschreiben".
Schön wäre es, wenn der Compiler beim abstract-Ansatz wirklich einen Fehler moniert. Leider macht er das wohl nicht, aber man kann sich auch so herausreden, das ein guter Entwickler sowieso eine umfangreiche Test-Unit mit seiner Klasse ausliefert, die dann auf nicht implementierten Methoden prüft. Ansonsten rennt ihr euch hier in Klugscheißerei fest, wenn ihr so weiter macht. Bisher ist davon natürlich weit und breit nichts zu sehen.:mrgreen: |
AW: Aufruf abstrakter Methode führt zu Fehler
Zitat:
Delphi-Quellcode:
ja nichts da. Beim Debugger gehts dann weiter. Wo soll denn der anhalten ?
virtual; abstract;
Mir wirds aber auch zu blöd. Wer unbedingt unnötige Fehlermeldungen im eigenen Programm haben will, der soll die Implementierung (auch wenn sie leer sein sollte) eben einfach weglassen. |
AW: Aufruf abstrakter Methode führt zu Fehler
Eine Klasse ist abstrakt, wenn sie entweder selber abstrakte Methoden deklariert oder solche von einer Elternklasse erbt, aber nicht selbst implementiert (überschreibt).
Da das Deklarieren einer abstrakten Klasse an sich nichts Verwerfliches ist, gibt der Compiler natürlich keine Warnung aus, wenn er eine solche findet. Die Warnung kommt erst dann, wenn man versucht, eine abstrakte Klasse zu instanziieren.
Delphi-Quellcode:
program AbstraktTest;
{$APPTYPE CONSOLE} uses SysUtils; type TAbstraktBasis = class(TObject) // Abstrakte Klasse, da abstrakte Methode deklariert public procedure Methode; virtual; abstract; end; TAbstraktAbgeleitet = class(TAbstraktBasis); // Abstrakte Klasse, da abstrakte Methode geerbt TKonkretAbgeleitet = class(TAbstraktBasis) // Keine abstrakte Klasse, da Methode implementiert public procedure Methode; override; end; { TKonkretAbgeleitet } procedure TKonkretAbgeleitet.Methode; begin WriteLn('Methode wurde implementiert'); end; { Programmcode } var AbstraktBasis: TAbstraktBasis; AbstraktAbgeleitet: TAbstraktBasis; KonkretAbgeleitet: TKonkretAbgeleitet; begin // Versuche, abstrakte Basisklasse zu instanziieren: AbstraktBasis := TAbstraktBasis.Create; // Versuche, abstrakte abgeleitete Klasse zu instanziieren: AbstraktAbgeleitet := TAbstraktAbgeleitet.Create; // Versuche, konkrete abgeleitete Klasse zu instanziieren: KonkretAbgeleitet := TKonkretAbgeleitet.Create; end. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 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