![]() |
Feld nur über Property zugreifen
Hallo Zusammen,
ist es möglich ein Feld innerhalb der Klasse zu sperren so dass man nur über das Property darauf zugreifen kann?
Delphi-Quellcode:
unit Tester;
interface uses Winapi.Windows; type TTest = class private fID : Integer; function GetID:Integer; procedure SetID(value: integer); procedure doWork; public property ID:Integer read GetID write SetID; end; implementation { TTest } procedure TTest.doWork; begin fID := -10; //<<< Wie kann den Zugriff auf das Feld innerhalb der // Klasse verhindern so dass ich über das Property gehen muss. ID := -10; end; function TTest.GetID: Integer; begin result := fID; end; procedure TTest.SetID(value: integer); begin if value < 0 then fID := 0 else fID := value; end; end. |
AW: Feld nur über Property zugreifen
Ich wüsste nicht, wie das gehen sollte. Da ist halt die Selbstdisziplin des Programmierers gefragt.
|
AW: Feld nur über Property zugreifen
Die Anforderung erscheint mir irgendwie unsinnig. Wenn es einen Weg gäbe, das Feld für jeglichen Schreibzugriff innerhalb der Klasse zu sperren, dann würde das ja auch für den Code in der Implementation von SetID gelten.
Man könnte das Feld aber auch mitsamt property und Zugriffsmethoden in eine Parent-Klasse verlagern und dort als strict private deklarieren. Dann kann man es in der Child-Klasse nicht mehr direkt ansprechen.
Delphi-Quellcode:
type
TTestBase = class strict private fID : Integer; function GetID:Integer; procedure SetID(value: integer); public property ID:Integer read GetID write SetID; end; type TTest = class(TTestBase) procedure doWork; end; |
AW: Feld nur über Property zugreifen
Ich sehe da nur eine Möglichkeit, nämlich zwei Klassen statt einer:
Die erste Klasse enthält das Feld, die Property samt Zugriffsmethoden (evtl. virtual). Dabei wird das Feld als strict private deklariert, der Rest als public oder protected, je nachdem welche Sichtbarkeit gewünscht ist. Die zweite ist von der ersten abgeleitet und enthält alles andere. Methoden dieser zweiten Klasse können nicht auf das Feld zugreifen, weil es als strict private deklariert ist. Edit: Uwe war schneller. |
AW: Feld nur über Property zugreifen
Ich würde vielleicht sowas machen:
Delphi-Quellcode:
Und im weiteren Verlauf dann vergessen, dass es dieses fMyStrictprivateIDWithSecretName gibt. Erhöht die angesprochene Selbstdiszpilin.
type
TTest = class private fMyStrictprivateIDWithSecretName : Integer; function GetID:Integer; procedure SetID(value: integer); procedure doWork; public property ID:Integer read GetID write SetID; end; implementation { TTest } function TTest.GetID: Integer; begin result := fMyStrictprivateIDWithSecretName; end; procedure TTest.SetID(value: integer); begin if value < 0 then fMyStrictprivateIDWithSecretName := 0 else fMyStrictprivateIDWithSecretName := value; end; |
AW: Feld nur über Property zugreifen
Alternativer Vorschlag ohne Vererbung:
Delphi-Quellcode:
type
TSafeInteger = record strict private FValue: Integer; public class operator Implicit(A: TSafeInteger): Integer; overload; class operator Implicit(A: Integer): TSafeInteger; overload; end; class operator TSafeInteger.Implicit(A: TSafeInteger): Integer; begin Result := A.FValue; end; class operator TSafeInteger.Implicit(A: Integer): TSafeInteger; begin if A < 0 then Result.FValue := 0 else Result.FValue := A; end; type TTest = class strict private fID: TSafeInteger; function GetID: Integer; procedure SetID(value: integer); private procedure doWork; public property ID:Integer read GetID write SetID; end; procedure TTest.doWork; begin fID := -10; // hier wird intern eine 0 geschrieben! // aber das geht halt nicht: // fID.FValue := -10; end; function TTest.GetID: Integer; begin result := fID; end; procedure TTest.SetID(value: integer); begin fID := value; end; |
AW: Feld nur über Property zugreifen
Hallo Zusammen,
die Absicht ist, mich selbst vor Fehlern zu schützen. :-) Dieses Beispiel passt relativ gut zu meinem Fall. Ich hatte vergessen dass ich für das Feld ein property erstellt hatte, der die Gültigkeit der Werte über einen Getter schützt. Wenn ich nicht daran denke, und das Feld direkt anspreche, umgehe ich die Getter Methode. Wenn es keine Möglichkeit gibt das Feld zu Schützen, werde ich solche Felder zukünftig besonders benennen nach dem Muster:
Code:
mit der Hoffnung dass ich dann beim Anwender darauf stoße und nach einem Property schaue. Ich hatte gehofft, es gibt so etwas wie eine Section "private protected" und ich muss nur das Feld in dieser Section verschieben und fertig.
fUseProperty_Depp_ID : Integer;
|
AW: Feld nur über Property zugreifen
Lustig, so ähnlich sieht mein Code für meinen eigenen Nullable Type auch aus :-). Trotzdem stellt sich mir hier die Frage nach der Sinnhaftigkeit, irgendwie widerspricht das doch den Grundsätzen der OOP, eine Klasse hat immer Zugriff auf ihre eigenen Felder.
|
AW: Feld nur über Property zugreifen
Zitat:
Das ist in der Tat ganz ähnlich wie bei Nullable-Types. Da wird ein vorhandener Datentyp auch um eine bestimmte Funktionalität ergänzt. |
AW: Feld nur über Property zugreifen
Dann nimm doch immer einen richtigen Namen, über den Du zugreifst. Falls dann ein Property daraus wird, ist die Eigenschaft mit dem vorangestellten 'f'. Die nimmst du eben nie, nie, nie in Deinem Code - ausser im Setter/Getter.
Das sollte die Leichtsinnsfehler vermeiden helfen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:23 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