Zitat von
DeddyH:
Das ist so nicht im Sinne der
OOP. Du hast eine Property (z.B. Name), welche über einen sog. Getter (z.B. GetName) ausgelesen und einen sog. Setter (z.B. SetName) gesetzt wird. Den Getter kannst Du meist auch weglassen und gleich den Feldinhalt zurückgeben, aber ein Setter kann zur Überprüfung ganz nützlich sein.
Natürlich können auch Getter mal ganz sinnvoll sein
So können Getter dyn. einen Wert berechnen und zurückgeben, statt dass man diesen immer in einer Variable speichert und aktuell hält. Als Beispiel könntest Du hier eine Liste von Zahlen implementieren, welche eine Methode zum hinzufügen von Werten besitzt. Eine mögliche Eigenschaft wäre dann der Mittelwert der eingefügten Zahlen. Den kannst Du halt nach jedem Einfügen berechnen und in einer Variable speichern oder Du verwendest einen Getter.
Delphi-Quellcode:
TMyList = class(TObject)
private
values: TIntegerDynArray;
protected
function getMean(): Integer;
public
procedure addValue(const value: Integer);
published
property mean: Integer read getMean;
end;
Für den Nutzer ist von "außen" nur das Property mean sichtbar, ob dies nun auf eine Variable zurückgreift oder wie hier eine Methode bemüht bleibt völlig transparent. Damit siehst Du schon eine wichtige Eigenschaft der Properties, Du kannst einfach leicht umstellen. Wird z.B. häufig auf den Mittelwert zugegriffen und nur sehr sehr selten (im Verhältnis dazu) ein neuer Wert eingefügt, dann wäre es wohl effizienter den Wert vorzuberechnen und in einer Variable zu speichern. Umgekehrt würde häufiges Hinzufügen von Werten und seltenes Lesen des Mittelwerts von der dyn. Berechnung profitieren. Somit kannst Du hier die Implementierung transparent austauschen. Für den Nutzer der Klasse gibt es immer nur ein Property, wo der zurückgelieferte Wert herkommt ist ihm egal.
Eine weitere wichtige Eigenschaft siehst Du auch noch, es gibt keine Möglichkeit von außen den Wert zu setzen. Das macht bei einem Mittelwert auch keinen Sinn, immerhin ist der ziemlich klar definiert und hängt allein von den Werten in der Liste ab. Da das Property mean hier nur eine read Eigenschaft besitzt verhält sich das Property wie eine Variable, die man eben nur lesen kann.
Natürlich gibt es auch Properties, die man sowohl Lesen als auch Setzen können muss, da hattest Du ja schon Beispiele gesehen. Die Vorteile sind natürlich die Gleichen. Insbesondere kann man (wie DeddyH ja sagte) eben auch die Gültigkeit prüfen. Z.B. könntest Du sicherstellen, dass das Alter >= 0 Jahre ist (ein Integer kann auch kleiner werden).