Autor Beitrag
Ares
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 128



BeitragVerfasst: Do 21.10.10 17:09 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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.