AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Klassen-Funktion benutzen, ohne die Klasse zu erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Klassen-Funktion benutzen, ohne die Klasse zu erstellen

Ein Thema von x000x · begonnen am 18. Nov 2010 · letzter Beitrag vom 19. Nov 2010
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#11

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 11:21
Dass dies vom Compiler nicht bemeckert wird, sollte daher als Bug angesehen werden.
Das kann der Compiler schlicht und ergreifend nicht prüfen. Du hast einen Instanzzeiger ( wenn der auch auf NIL weist ) und über diesen Zeiger rufst du eine Methode auf.
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
Glückauf
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#12

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 11:38
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#13

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 11:48
Warum zufällig?
Ja OK, von seiten Delphis ist es "absicht", aber von seinen des Programmierers und in Anbetracht, daß er keine Ahnung hatte, was er macht, war es eher Zufall, daß er z.B. kein Feld verwendet hatte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#14

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 11:51
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
Glückauf
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#15

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 11:58
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.
Ich sehe hier weder einen Grund für eine Fehlermeldung, noch für eine Exception. Der Aufruf FTest.Test(str); wird vom Compiler implizit umgewandelt in so etwas wie TDummyClass.Test(FTest, str); . 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.

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:
FTest := nil;
FTest.Free;
Die Implementierung von Free prüft dabei explizit auf Self <> nil . 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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#16

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 12:08
@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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#17

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 12:18
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.
Das Problem an der Stelle ist : Woher sollte der Compiler das wissen ?
Glückauf
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#18

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 13:48
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#19

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 14:36
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.
Schlechter Vergleich. Wenn du vor oder nach einem Array schreibst, veränderst du ungewollt andere Daten ( wenn du ließt, ließt du garantiert was falsches ). Ein Vergleich zu deinem Vergleich :
Es ist wie irgendjemanden auf der Straße in die Geldbörse zu greifen. Rein Technisch ist das Geld ja da
Glückauf
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#20

AW: Klassen-Funktion benutzen, ohne die Klasse zu erstellen

  Alt 18. Nov 2010, 16:02
Du willst mich nicht verstehen
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 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