Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Getter-Methode mit Parameter (https://www.delphipraxis.net/192043-getter-methode-mit-parameter.html)

StepByStep 16. Mär 2017 08:22

Getter-Methode mit Parameter
 
Hallo liebe Delphianer,

ich habe eine kleine Frage zu Properties und ihren Getter- und Settermethoden. Selbstverständlich habe ich diese schon mal genutzt und bin mit dem Gebrauch vertraut, doch jetzt stehe ich vor einem Problem, welches ich zuvor noch nicht hatte und ich aus meiner Suche im Internet nicht ganz schlau werde.

Die Ausgangsstellung ist folgende:

Ich habe eine Property die wie folgendermaßen aussieht...

Delphi-Quellcode:
property AsString: string read GetAsString write SetAsString;
In der GetAsString-Methode baue ich mir ein XML zusammen, in der SetAsString-Methode parse ich das XML auseinander. diese zwei Methoden sehen wie folgt aus...

Delphi-Quellcode:
function GetAsString: string;
procedure SetAsString(const Value: string);
Nun iteriere ich in der GetAsString-Methode eine Schleife durch, das ist soweit in Ordnung, aber ich möchte gerne das XML so bauen können, dass ich anhand einer TList<Integer> nur für bestimmte Indexstellen eine XML-Zeile schreibe, also dachte ich, dass ich der GetAsString-Methode eine TList<Integer> übergeben könnte. Das hatte ich gegoogelt und bin auf verschiedene Quellen gestoßen, sodass ich folgendes nun hätte, wovon ich nicht ganz sicher bin, ob es korrekt ist:

Delphi-Quellcode:
property AsString[AIndexList: TList<Integer>]: string read GetAsString write SetAsString
function GetAsString(AIndexList: TList<Integer> = nil): string;
procedure SetAsString(const Value: string);
Das wirft aber einen Fehler, es seien inkompatible Typen. Wenn ich lesen kann, dann vermute ich, dass die SetAsString-Methode ebenfalls diesen Array benötigt, richtig? Aber gibt es eine Möglichkeit der AsString-Property die Liste zu übergeben, sodass nur die GetAsString-Methode diese nutzt, weil in der SetAsString-Methode ist sie überflüssig. In der GetAsString-Methode ist diese Liste übrigens nur optional und muss nicht zwangsläufig übergeben werden.

Der Aufruf der Property müsste demnach doch so lauten:
Delphi-Quellcode:
.AsString[Liste]
?

Ich bedanke mich im Voraus schon einmal für die Antworten!

Gruß
Jan

jaenicke 16. Mär 2017 08:27

AW: Getter-Methode mit Parameter
 
Nein, das geht nicht.

In diesem Fall würde ich auf die Property verzichten und direkt mit Gettern und Settern arbeiten. Eine Liste als Index einer Propery finde ich sowieso grenzwertig.

StepByStep 16. Mär 2017 08:44

AW: Getter-Methode mit Parameter
 
Verdammt...

Ich dachte mir schon, dass das nicht geht, aber fragen kostet nichts. Die Getter-Methode direkt zu nutzen und somit public zu machen finde ich aber auch eine blöde Lösung, zumal die Property in mehreren Units genutzt wird. Dann hilft das alles nichts und ich brauche einen anderen Ansatz, trotzdem danke für deine Antwort!

Gruß
Jan

himitsu 16. Mär 2017 08:50

AW: Getter-Methode mit Parameter
 
Delphi-Quellcode:
function GetAsString(AIndexList: TList<Integer>): string;
procedure SetAsString(AIndexList: TList<Integer>; const Value: string);
property AsString[AIndexList: TList<Integer>]: string read GetAsString write SetAsString;
Ich weiß nicht was ihr habt, denn bei mir geht das natürllich. :stupid:

BrightAngel 16. Mär 2017 09:02

AW: Getter-Methode mit Parameter
 
Zitat:

Zitat von jaenicke (Beitrag 1364371)
In diesem Fall würde ich auf die Property verzichten und direkt mit Gettern und Settern arbeiten. Eine Liste als Index einer Propery finde ich sowieso grenzwertig.

Sehe ich genauso. Grund: Du Serialisierst und Deserialisierst Daten (bringst sie aus der Textuellen Repräsentation in die Objekt orientierte und umgekehrt). Theoretisch sollte bei einer Property die Invariante gelten, dass ein Getter immer exakt das selbe zurückgeliefert wie beim Setter davor gesetzt wurde. Warum ist das im Fall von XML sagen wir "schwierig"?
Die textuelle Repräsentation der Daten enthält noch weitere Information, die in der anderen Repräsentation fehlen. XML ist zum Beispiel zwecks Formatierung sehr tolerant was Whitespace angeht. Beim Deserialisieren von XML wird diese "wo ist Whitespace" Information nicht mit in die Objektrepräsentation übernommen. Auch könnten gegebenenfalls Kommentarstellen komplett wegfallen. Dadurch wird die Deserialisierung irreversibel. Du kannst zwar einen ähnlichen Datenstrom erzeugen (z.B. durch Pretty Printing), aber dieser wird nicht für alle Originale den Originalen vollständig entsprechen. :thumb:

Brighty

StepByStep 20. Mär 2017 08:43

AW: Getter-Methode mit Parameter
 
Guten Morgen!

Glücklicher Weise habe ich eine andere Alternative gefunden, wie ich ohne meine zwei genannten Getter- und Settermethoden arbeiten konnte, zumindest für meinen Anwendungsfall.

@himitsu Ja, so hat das bei mir auch funktioniert, aber mein erster Wunsch war, dass die Settermethode nicht zwingend diesen Paramter enthält, leider geht das ja nicht.

@BrightAngel Das klingt plausibel, mir war im ersten Moment leider keine andere Alternative eingefallen... Danke aber nochmal für die ausführliche Erklärung. ^^

Gruß
Jan


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf