Wäre dies im konkreten Fall eine Möglichkeit?
Heißt das beispielsweise, ich könnte mit dieser Möglichkeit die "Aufaddierung" mittels class function realisieren und dann nach Instanzierung der class ausführen?
Nein, wenn du deine
Addition
Funktion ohne Änderungen beibehalten willst, darfst/kannst du sie nicht zu einer
class procedure
machen, da dann nicht mehr auf die (Instanz-)Felder
FErgebnis, FZahl1 und FZahl2
zugegriffen werden kann. Die Begründung hast du dir schon selbst gegeben mit
Man könne eine class procedure auch dann ausführen, wenn die Klasse noch garnicht instanziert wurde habe ich gelesen
Die ist nämlich vollkommen korrekt. Der Aufruf würde dann über
TMyClass.Test()
erfolgen anstelle von
TMyClass.Create.Test() bzw. MyClassInstanze.Test()
.
Es gibt im Grunde 3 verschiedene Varianten, die man betrachten muss:
- procedure Test;
Dies ist eine Instanz-Methode, welche im versteckten Self
Parameter einen Zeiger auf die aktuelle Instanz beinhaltet
- class procedure Test;
Im Grunde noch nicht sehr verschieden zur "normalen" Methode, nur mit dem Unterschied, dass Self
hier nicht auf die Instanz verweist, sondern auf die Klasse. Zugriff auf "normale" Instanz-Felder bzw. -Methoden ist hier schon nicht mehr möglich.
- class procedure Test; static;
Bei dieser Variante fehlt der Self
Parameter komplett. Hierdurch bedingt gellten die gleichen Einschränkungen wie bei einer class procedure
ohne static
. Diese Art von "Methode" kann (und wird oft) auch in Records verwendet werden. Hierbei ist diese Deklaration unter der Haube komplett identisch mit einer normalen procedure
, die du außerhalb einer Klasse (z.b. "freischwebend" im implementation
Abschnitt deiner Unit) deklarierst.
Wofür benutzt man diese grundsätzlich überhaupt?
Es ist im Grunde einfach die modernere Schreibweise für ansonsten besagte "freischwebende" Funktionen. Vorteil ist, dass die "Methode" dann thematisch einer Klasse/einem Record zugeordnet werden kann und somit dann an einer Stelle deklariert wird, an der es vom Kontext her Sinn macht. Außerdem kann es als kleine Performanceoptimierung angesehen werden und sollte meiner Meinung nach auch immer eingesetz werden, wenn man eine Methode schreibt, die tatsächlich die konkrete Instanz nicht kennen muss.
Wäre das Additionsbeispiel mit der von mir gewollten "Aufaddition" für ein Beispiel mit class function geeignet und könntest Du mir da etwas aufzeigen?
Ohne Änderung und mit den Feldern so nicht machbar. Möglich wäre allerdings der schonmal genannte Prototyp
class function TAddition.Add(Value1, Value2: Integer): Integer; static;
.
Statt
Delphi-Quellcode:
Add.Zahl1 := StrToIntDef(edtZahl1.text,0);
Add.Zahl2 := StrToIntDef(EdtZahl2.Text, 0);
Add.Addition;
LblErgebnis.Caption := IntToStr(Add.Ergebnis);
würde sich dein Aufruf dann in
Delphi-Quellcode:
LblErgebnis.Caption :=
IntToStr(TAddition.Add(StrToIntDef(edtZahl1.text,0), StrToIntDef(edtZahl2.text,0));
ändern.
Wie du siehst wäre dann hierfür auch keine Instanz notwendig. Die
Aufsummierung
kann man allerdings nicht in dieser Form umschreiben, da du dir hier den Wert ja zwischen zwei Aufrufen merken willst, demnach also zwingend eine Instanz mit Feld benötigst.
Edit:
Noch eine Verfahrensfrage: Wie füge ich ein Zitat mit dem Hinweis von wem es kommt hier ein
Dazu kannst du einfach auf den "Zitat" Button rechts unterhalb eines beliebigen Beitrags klicken.