Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Ist das eine Methode oder Prozedur? (https://www.delphipraxis.net/217531-ist-das-eine-methode-oder-prozedur.html)

Alallart 20. Jul 2025 11:20

Ist das eine Methode oder Prozedur?
 
Nur eine Verständnissfrage. Add ist eine Methode der Klasse. Spricht man bei Find auch von einer Methode? Schließlich ist sie Private. Theoretisch greift später niemand drauf zu, also eine Prozedur und keine Methode.
Delphi-Quellcode:
type
  TKlasse = class(TObject)
  private
    procedure Find;
  public
    procedure Add;
  end;

jaenicke 20. Jul 2025 11:24

AW: Ist das eine Methode oder Prozedur?
 
Jede Prozedur oder Funktion, die in der Deklaration einer Klasse deklariert ist, ist eine Methode, egal mit welcher Sichtbarkeit sie deklariert wurde.

Der technische Unterschied ist, dass beim Aufruf einer Methode der Self-Pointer mitgegeben werden muss, sprich die Instanz der Klasse, in dessen Kontext die Methode aufgerufen wird.

Alallart 20. Jul 2025 11:34

AW: Ist das eine Methode oder Prozedur?
 
Ok, danke dir. Ich habe auch immer von Methode gesprochen, wurde dann aber etwas unsicher.

peterbelow 20. Jul 2025 11:54

AW: Ist das eine Methode oder Prozedur?
 
Jede procedure oder function, die als Teil einer Klasse deklariert ist wird per Konvention als Methode bezeichnet, die Sichtbarkeit spielt keine Rolle. Es gibt einen wesentlichen wenn auch versteckten Unterschied zwischen Methoden und eigenständigen procedure oder functions (gemeinhin als Routinen bezeichnet): Methoden haben einen versteckten zusätzlichen Parameter in dem bei einem Aufruf der Methode die Referenz (Zeiger) des Objektes übergeben wird für das die Methode arbeiten soll. Innerhalb des Kodes der Methode kann man explizit über den Bezeichner "self" auf diesen Parameter zugreifen und er wird auch intern verwendet, um auf Felder, properties oder andere Methoden des Objektes zuzugreifen. Wegen dieses Parameters kann man eine Methode nur für ein Objekt (Instanz einer Klasse) aufrufen, d. h. über die objectvariable.methode Syntax. Nur innerhalb des Kodes einer Methode kann man eine andere Methode der gleichen Klasse direkt aufrufen, weil der Compiler da automatisch self für die objectvariable verwendet.

Bei als "class procedure" oder "class function" deklarierten Methoden ist der self-Parameter übrigens eine Referenz auf die Klasse selbst; die Addresse der ziemlich komplexen in-memory Struktur, die der Compiler für jede Klasse erzeugt. Ein constructor ist im Prinzip auch nur eine class function, ein destructor dagegen eine (fast) normale Methode.

Um die Verwirrung komplett zu machen: wenn eine class procedure/function mit dem "static" Keyword deklariert wird bekommt sie keinen self-Parameter, ist also was die Parameter angeht, äquivalent zu einer eigenständigen Routine. Sie im Rahmen einer Klasse zu deklarieren gibt einem aber die Möglichkeit, quasi einen eigenen Namespace innerhalb einer Unit zu schaffen, in dem man konzeptionell zusammengehörige Routinen bündeln kann.

Du solltest dich mal von Vorne bis Hinten durch den Delphi Language Guide arbeiten. Da findet man solche Infos. War noch einfacher, als es den noch als gedrucktes Buch gab, aber es geht auch online oder mit der offline-Hilfe. Und es lohnt sich, glaub mir...

Redeemer 21. Jul 2025 14:20

AW: Ist das eine Methode oder Prozedur?
 
Welchen praktischen Unterschiedlich macht "static" oder nicht? Record-Klassenfunktionen müssen ja "static" sein, aber das hat mich bisher nicht gestört.

himitsu 21. Jul 2025 15:59

AW: Ist das eine Methode oder Prozedur?
 
Da Records leider keine Vererbung besitzen, macht dort der Self-Parameter bei einer Class-Function keinen Sinn.
Delphi hat das auch garnicht implementiert, und somit gibt es nur STATIC.
Leider wird das dann nicht einfach als DEFAULT genommen und muß explizit angegeben werden.


function -> mit Self = Objekt-Zeiger
class function -> mit Self = ClassType
class function static = kein Self
(PS: das Self ist ein "unsichtbarer" impliziter Parameter an allen Klassen-Methoden)

dummzeuch 21. Jul 2025 16:01

AW: Ist das eine Methode oder Prozedur?
 
Zitat:

Zitat von Redeemer (Beitrag 1550376)
Welchen praktischen Unterschiedlich macht "static" oder nicht? Record-Klassenfunktionen müssen ja "static" sein, aber das hat mich bisher nicht gestört.

Static -> Es wird kein zusätzlicher Pointer auf die Klassendeklaration übergeben. D.h. unter anderem, dass eine solche Klassen-Methode nicht virtuell sein kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 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