Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#19

AW: Aufrechnen von Integer-Werten in ein neues Ergebnis

  Alt 2. Feb 2018, 12:13
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:
  1. procedure Test;
    Dies ist eine Instanz-Methode, welche im versteckten Self Parameter einen Zeiger auf die aktuelle Instanz beinhaltet
  2. 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.
  3. 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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 2. Feb 2018 um 12:16 Uhr)
  Mit Zitat antworten Zitat