Gültigkeit von Klassenvariablen

02/02/2009 - 17:47 von Frank Bach | Report spam
Hallo NG,

ich habe eine Klasse die ich zur Steuerung von mehreren Fenstern benötige,
also habe ich die als
globale Objektvariable in einem Modul definiert:

Klassendefinition:

Friend Class UserClass
Public Property xxx ...
Friend Property yyy
Property zzz ...
End Class

Verwendung in einem Modul:

Friend globalUser as new UserClass


Jetzt habe ich mehrere Fragen:

1. Ist durch Friend sichergestellt, dass das Objekt nicht von außen (=
anderes Programm) manipuliert werden kann? (Das Objekt steuert
Benutzer-Berechtigungen für diverse Vorgànge)
2. Wenn ich die Klasse als "Friend Class ..." definiere, wie wirkt sich dann
eine "Public Property ..."-Definition aus?
3. Wenn ich ein Property ohne Public/Friend definiere, was ist Standard?
4. Wenn ich das Objekt als "Friend" definiere, spielt es dann überhaupt eine
Rolle ob ich die Klasse als Public oder Friend definiert habe?


Danke!

Frank
 

Lesen sie die antworten

#1 Elmar Boye
02/02/2009 - 18:51 | Warnen spam
Hallo Frank,

Frank Bach schrieb:
ich habe eine Klasse die ich zur Steuerung von mehreren Fenstern benötige,
also habe ich die als
globale Objektvariable in einem Modul definiert:

Klassendefinition:

Friend Class UserClass
Public Property xxx ...
Friend Property yyy
Property zzz ...
End Class

Verwendung in einem Modul:

Friend globalUser as new UserClass



Mach ein Singleton daraus, das ist sauberer, spart das Modul
und mit einer Handvoll Zeilen gemacht:

' Wenn keine Instanzierung von außen möglich sein soll
Private Sub New()
End Sub

Private Shared __instance As New UserClass()

' Für den Zugriff auf die Klasse
Public Shared ReadOnly Property Instance() As UserClass
Get
Return __instance
End Get
End Property

1. Ist durch Friend sichergestellt, dass das Objekt nicht von außen (=
anderes Programm) manipuliert werden kann? (Das Objekt steuert
Benutzer-Berechtigungen für diverse Vorgànge)



Durch Friend wird sichergestellt, das nur innerhalb der Assembly,
in der die Klasse definiert wird, auf die Instanz zugegriffen werden kann.
Andere Assemblies sehen Friend Klassen gar nicht erst.

Der Kompiler làsst Dich auch keine Public Instanzen nach außen weitergeben,
z. B. über ein an anderer Stelle definerte Eigenschaft. Ein

Public Property EineUserClass() As UserClass
...
End Property
erzeugt einen Fehler.

Als Ausnahme wàre hier Reflection zu nennen, wozu aber Code-Berechtigungen
(ReflectionPermission bzw. FullTrust) erforderlich wàre.

2. Wenn ich die Klasse als "Friend Class ..." definiere, wie wirkt sich dann
eine "Public Property ..."-Definition aus?



Im Endeffekt ist die Sichtbarkeit weiterhin Friend, da ein
Aussenstehender die Klasse gar nicht erst zu sehen bekommt.

Generell kann eine Methode oder Eigenschaft die Sicherbarkeit
nicht erweitern, sondern nur weiter einschrànken.

3. Wenn ich ein Property ohne Public/Friend definiere, was ist Standard?



In Visual Basic ist die Standard-Zugriff Public. Mehr dazu:
<URL:http://msdn.microsoft.com/de-de/lib...x.aspx>
"Zugriffsebenen in Visual Basic"

(Ich würde es immer schreiben, um es deutlich zu machen.)

4. Wenn ich das Objekt als "Friend" definiere, spielt es dann überhaupt eine
Rolle ob ich die Klasse als Public oder Friend definiert habe?



Wenn Du die Klasse als Public erklàrst, kann ein Außenstehender
die Klasse verwenden oder von ihr ableiten.

Und streng genommen: Da eine Klasse einen Vertrag darstellt,
bist Du für ihre Wiederverwendbarkeit auf Dauer verantwortlich,
wenn Du sie in einer Bibliothek öffentlich machst.
Änderungen an den öffentlichen Mitgliedern (hier Eigenschaften),
wie z. B. das Ändern des Datentyp stellen einen Bruch des
Vertrags dar (engl. "breaking change")
(Was auch bei internem Gebrauch zwischen Entwicklern schon mal
ein Problem werden kann. Auf der anderen Seite Microsoft
beim .NET Framework nicht davon abgehalten hat, es zu tun).

Grundsàtzlich sollte man sich an
<URL:http://msdn.microsoft.com/de-de/lib...2.aspx>
"Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken"
halten, um möglichst eine konsistente Entwicklung über làngere
Zeit und bei unterschiedlichen Entwicklern sicherzustellen.

Im Falle des oben gezeigten Singleton, kannst Du die Klasse
öffentlich machen, wenn Du den Konstruktor (New) Private machst.
Und bei den Eigenschaften im einzelnen entscheidest, ob sie
Public, Friend oder Private sein sollen.

Dann geht:
Dim uc As VbLibary.UserClass
uc = Vb2008Controls.UserClass.Instance
nicht aber:
uc = New VbLibary.UserClass()

Gruß Elmar

Ähnliche fragen