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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 18. Nov 2010, 08:44
Klasenmethoden funktionieren unabhängig von Instanzen. allerdings handelt es sich in deinem Fall um eine normale Methode
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#2

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

  Alt 18. Nov 2010, 09:03
Klasenmethoden funktionieren unabhängig von Instanzen. allerdings handelt es sich in deinem Fall um eine normale Methode
Ja, das ist mir bekannt - dann hätte ich class davor schreiben müssen und der Aufruf wäre dann TDummyClass.Test. Das steht dort aber nicht und trotzdem funktionierts.

Werden denn beim Erstellen einer Instanz mit FTest:= TDummyClass.Create; nur die Felder initialisiert? Vermutlich ja, dann macht das auch Sinn das es funktioniert.
Sobald ich dann aber auf Felder der Klasse zugreife, dann knallts.

Ok, ich denke ich verstehe... Vielen Dank
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

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

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

  Alt 18. Nov 2010, 09:05
Werden denn beim Erstellen einer Instanz mit FTest:= TDummyClass.Create; nur die Felder initialisiert?
Es wird auch die Adresse der VMT in die Instanz kopiert. Darum geht ein Zugriff auf eine Virtuelle Methode ohne Create auch schief
Glückauf
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#4

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

  Alt 18. Nov 2010, 09:15
Es wird auch die Adresse der VMT in die Instanz kopiert. Darum geht ein Zugriff auf eine Virtuelle Methode ohne Create auch schief
Ok, danke
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 18. Nov 2010, 10:31
Es wird auch die Adresse der VMT in die Instanz kopiert. Darum geht ein Zugriff auf eine Virtuelle Methode ohne Create auch schief
Es wird auch der Speicher für die Klasse erstellt, worin die Felder liegen.

PS: Das Ganze ist ein klassisches Beispiel, für eine Klassenmethode, welche man ohne Instanz nutzen kann.
Delphi-Quellcode:
TDummyClass = class
public
  class procedure Test(var paStrString: String);
end;


TDummyClass.Test(xxx);
Also, wie vielleicht aus den Beiträgen ersichtlich war, ist dein Code rein zufällig gelaufen ... besser wäre eine Klassenmethode gewesen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#6

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

  Alt 18. Nov 2010, 10:52
Also, wie vielleicht aus den Beiträgen ersichtlich war, ist dein Code rein zufällig gelaufen ... besser wäre eine Klassenmethode gewesen.
Warum zufällig? Zufällig heisst doch, dass es mal funktioniert und mal nicht?! Das Beispiel funktioniert immer (solange halt in der klassenmethode keine Felder der Klasse benutzt werden)

Ein Kollege hat mich darauf angesprochen und ich war der Meinung, dass es nicht funktionieren kann - da ja keine Instanz erzeugt wurde. Und ich wurde eines besseren belehrt.
Das Code-Beispiel aus dem ersten Post ist meiner Meinung nach nicht zu verwenden, da es z.b. bei Programmpflege durch mehrere Programmierer zu Fehlern kommen wird.

Eigentlich dürfte so etwas FTest.Test(str); ohne erzeugen einer Instanz von Haus aus gar nicht funktionieren - denn wie bereits geschrieben bekommt man das gleiche Verhalten
durch Klassenmethoden erreicht und ist damit auf der sicheren Seite was die Pflege von Programmen angeht.
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#7

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

  Alt 18. Nov 2010, 11:12
Es dürfte laut Paradigma nicht gehen. Es geht dennoch, weil nichtvirtuelle Methoden stets nur in der Klassendeklaration stehen, und auch Instanzen immer nur auf diese verweisen - sie werden nicht pro Instanz immer wieder kopiert. Die Theorie verbietet hier etwas, was technisch kein Problem wäre, jedoch zu welchen führen kann. Dass dies vom Compiler nicht bemeckert wird, sollte daher als Bug angesehen werden.
"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
44.374 Beiträge
 
Delphi 12 Athens
 
#8

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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#9

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

  Alt 18. Nov 2010, 21:53
Klasenmethoden funktionieren unabhängig von Instanzen. allerdings handelt es sich in deinem Fall um eine normale Methode
Ja, das ist mir bekannt - dann hätte ich class davor schreiben müssen und der Aufruf wäre dann TDummyClass.Test. Das steht dort aber nicht und trotzdem funktionierts.

Werden denn beim Erstellen einer Instanz mit FTest:= TDummyClass.Create; nur die Felder initialisiert? Vermutlich ja, dann macht das auch Sinn das es funktioniert.
Sobald ich dann aber auf Felder der Klasse zugreife, dann knallts.

Ok, ich denke ich verstehe... Vielen Dank
Die aufgerufene Methode ist ausserdem statisch, die Klasse hat keinen Vorgänger mit viertuellen Methoden. Somit ist diese Klasse auch ohne Konstruktoraufruf uneingeschränkt benutzbar. Mich wundert, das das in diesem Fall bei Feldern der Klasse nicht funktionieren soll, sofern die Felder public definiert sind. Probleme könnte es dann höchstens bei Eigenschaften geben, die ja intern im Stream gespeichert werden, was der Compiler geschickt verbirgt.
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 18. Nov 2010, 22:01
Mich wundert, das das in diesem Fall bei Feldern der Klasse nicht funktionieren soll, sofern die Felder public definiert sind.
Zugriffe auf Felder und virtuelle/dynamische Methoden werden über einen Offset zu Self ausgeführt.
Ist nun Self = nil oder ein ungültiger Wert, dann geht das natürlich schief.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:14 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-2025 by Thomas Breitkreuz