Entwickler-Ecke

C# - Die Sprache - Wie kann man eine "echte" Read-Only Eigenschaft erstellen?


Ares - Do 21.10.10 17:09
Titel: Wie kann man eine "echte" Read-Only Eigenschaft erstellen?
Hallo!

Ich stehe gerade vor dem Problem, wie eine Klasse sicherstellen kann, dass eine Eigenschaft nicht verändert wird. Klar, dafür gibt es Getter und Setter, und wenn nur ein Getter vorhanden ist, ist die Eigenschaft read-only. Aber so einfach ist es dann doch nicht:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
public class Reifen {
   public int Druck;
}

public class Auto {
   private Reifen reifenVorneLinks;

   public Auto() {
      reifenVorneLinks = new Reifen();
      reifenVorneLinks.Druck = 10;
   }

   public Reifen ReifenVorneLinks {
      get { return reifenVorneLinks; }
   }
}


...
Auto meinAuto = new Auto();
Reifen irgendeinReifen = new Reifen();

// Nicht möglich, weil "ReifenVorneLinks" read-only ist.
meinAuto.ReifenVorneLinks = irgendeinReifen;

// Möglich, weil "ReifenVorneLinks" nicht wirklich read-onlny ist...
meinAuto.ReifenVorneLinks.Druck = 20;


Read-Only gilt also nur für eine Eigenschaft, aber nicht für die Eigenschaften dieser Eigenschaft :-)

Wie müsst man in diesem Beispiel vorgehen, wenn das ein Auto-Objekt sicherstellen will, dass zwar der linke Vorderreifen öffentlich zugänglich sein soll, aber der Reifendruck nur vom Auto-Objekt selbst verändert werden kann?

Besten Dank
Ares


Kha - Do 21.10.10 18:00

Das lässt sich überhaupt nicht verhindern, da Objekte keinen "Besitz" anderer Objekte festlegen können und so jede Referenz gleichberechtigten Zugriff besitzt. In einer öffentlichen API würde man Druck wahrscheinlich als public get; internal set; festlegen und dann zum Setzen eine public Eigenschaft in Auto erstellen.


Yogu - Do 21.10.10 18:12

Je nachdem, was Reifen noch so beinhaltet, könntest du die Klasse auch immutable, also unveränderlich machen. Das heißt, ihre Eigenschaften können von niemandem, nichtmal von ihr selbst geändert werden. Um den Reifendruck zu ändern, muss man einen neuen Reifen instanzieren und ihm im Konstruktur den Druck übergeben.