AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Zitat:
Anders wäre es, wenn du TIrgentwas.Methode aufrufst. Da kann der Compiler prüfen, on es sich bei der Methode um eine Klassenmethode handelt und tut das auch. Wenn die Gültigkeit der Instanz zur Laufzeit jedes mal geprüft werden würd, würde das auch nichts bringen, weil 1. Jede Menge Zeit verplempert würde und 2. Nichts anderes ans eine Fehlermeldung geworfen werden könnte |
AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Eine Fehlermeldung wäre ja schon mal was ;). Und eine Prüfung auf nil ist soooo teuer nun auch nicht, da laufen z.B. in managed Umgebungen ganz andere Dinge unsichtbar ab. Wenn die Instanz nicht nil, und dennoch ungültig ist - das ist was anderes. Dann kann ich ja auch auf die Felder zugrifen und erhalte lustige Dinge.
Und ja, der Debugger wäre wohl eher geeignet an dieser Stelle. Es müsste schlicht eine Exception her. |
AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Zitat:
|
AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Natürlich ist eine Prüfung auf NIL nicht so aufwändig ( mindestens 4 Zusätzliche Assembler-Anweisungen ), aber sie müßte vor jeder Benutzung der Klasse erfolgen, das macht sie so aufwändig.
Und eine Fehlermeldung zu werfen, wenn die korrekte Arbeitsweise der Klasse sichergestellt ist, finde ich recht unsinnig |
AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Zitat:
Delphi-Quellcode:
wird vom Compiler implizit umgewandelt in so etwas wie
FTest.Test(str);
Delphi-Quellcode:
. Solange innerhalb der Methode nicht auf Self (= FTest) zugegriffen wird, ist doch egal, ob das nil ist. Wenn ich aber darauf zugreife, wird eine Nil-Referenz ausgelöst und da wäre dann ja die Exception.
TDummyClass.Test(FTest, str);
Der Compiler könnte allenfalls einen Hinweis auswerfen, daß die Methode vielleicht besser als Class-Method deklariert werden sollte, aber mehr braucht's IMHO nicht. Eine generelle Überprüfung von Self auf nil halte ich für Verschwendung. Übrigens funktioniert auch folgendes:
Delphi-Quellcode:
Die Implementierung von Free prüft dabei explizit auf
FTest := nil;
FTest.Free;
Delphi-Quellcode:
. Eine solche Überprüfung kann selbstverständlich auch in jeder anderen Methode einer Klasse erfolgen und nach Gusto auf das Ergebnis reagiert werden. Muss ja nicht immer 'ne Exception sein.
Self <> nil
|
AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
@Uwe: Es wird da nichts implizit umgewandelt.
Es bleibt ein Aufruf einer stinknormalen Methode, nur daß "Self" eben nil ist (da hier praktischer Weise dieses von der Elternklasse so initialisiert wurde) und wenn man intern nun nichts nutzt, welches das Objekt benötigen würde, dann fällt es nicht auf. PS: Wäre das FTest eine lokale Variable gewesen, dann hätte Self auf sonstwas stehen können und eine Prüfung auf NIL hätte meistens nichts gebracht. |
AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Zitat:
|
AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Eine Exception wäre imho sehr wohl angebracht! Ich weiss, dass es technisch gesehen keinen Grund dafür gibt, es ist viel mehr eine Frage davon, in wie weit man die Paradigmen der OOP erzwingen möchte. Evtl. ist das mit Arraygrenzen vergleichbar: Es gibt technisch gesehen keinen Grund, beim Griff vor oder hinter ein Array zu meckern - der Speicher ist ja da. Es wiederpricht nur der Theorie des Arrays, welches nicht vorsieht länger zu sein, als es ist. Hier hat Delphi mit der Bereichsprüfung die Wahl geschaffen, ob man diese Hilfe haben mag oder nicht, was imho auch ein gangbarer Weg wäre. Nicht alles was praktisch möglich ist, ist mit der Theorie zu vereinbaren. Man muss sich nur für eines entscheiden.
|
AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Zitat:
Es ist wie irgendjemanden auf der Straße in die Geldbörse zu greifen. Rein Technisch ist das Geld ja da :wink: |
AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Du willst mich nicht verstehen :cry:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr. |
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