Problem bei Zugriff auf Eigenschaft

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Problem bei Zugriff auf Eigenschaft

    Hallo.

    Ich sitze grade vor einem recht blöden Problem, da ich wirklich überhaupt keine Ahnung habe wie ich es angehen könnte.
    Ich habe zwei Klassen. Die eine Klasse soll Zugriff auf eine Eigenschaft der anderen Klasse besitzen, ohne dass irgendeine andere Klasse aus dem Projekt ebenfalls Zugriff erhält (Friend fällt also aus). Der Zugriff soll also exklusiv für diese eine Klasse sein. Ich habe es zunächst mit einer Schachtelung versucht, musste aber feststellen, dass nur die geschachtelte Klasse Zugriff auf die enthaltende Klasse hat und leider nicht umgekehrt. Andersrum schachteln kann ich nicht machen, da das vollkommen der Logik zu wieder geht.

    Beispiel:

    VB.NET-Quellcode

    1. Public Class A
    2. End Class
    3. Public Class B
    4. Private Property Test As Integer
    5. End Class
    6. Public Class C
    7. End Class

    Klasse A soll in diesem Fall Zugriff auf die Eigenschaft Test von Instanzen von B haben, aber Klasse C nicht. Ist da überhaupt möglich?

    So habe ich es versucht:

    VB.NET-Quellcode

    1. Public Class A
    2. Public Class B
    3. Private Property Test As Integer
    4. End Class
    5. End Class

    Jedoch ist es dann genau verkehrt herum: Klasse B hat Zugriff auf Klasse A. Die Schachtelung anders herum zu machen würde das Problem vermutlich lösen, jedoch würde das die komplette Ordnung über den Haufen werfen, da es in meinem Kontext unlogisch ist.
    Stimmt, hätte ich vielleicht erwähnen sollen :).
    Klasse A hält in einer BindingList Instanzen von Klasse B. Wenn eine Instanz nun hinzugefügt wird soll die Instanz der Klasse A eine Eigenschaft der übergebenen B-Instanz auf sich selbst setzen, damit die B-Instanz weiß, welchem A sie zugeordnet ist. Die Eigenschaft soll wieder auf Nothing gesetzt werden, wenn B aus der Liste entfernt wird. Allerdings soll niemand anderes aus der Instanz von B wissen, welcher A-Instanz sie zugeordnet ist.
    Hi
    mach's doch per Friend. Normalerweise gibt man ja eh die Dlls direkt weiter und da hat ja dann keiner mehr Zugriff. Wozu benötigst du das genau? Bei den gängigeren Sachen hätte ich einfach eine Property definiert, die im Setter das Objekt aus dem alten A entfernt, wenn es nicht Nothing ist, das A gesetzt, und zur neuen hinzugefügt, sofern eben das nicht Nothing ist. Per Friend könntest du dann eben einen direkten Setter implementieren, der die B-Instanz nur vom alten A entfernt und dann eben das A festlegt, ohne es ihm direkt hinzuzufügen (oder als Abfrage mit Contains, ist aber dann eben unnötiger Aufwand).

    Gruß
    ~blaze~
    Ja, so würde ich das eigentlich auch machen, mir fehlt eben nur der richtige Zugriffsmodifizierer. Wenns in ner anderen DLL wäre würde Friend funktionieren, es ist aber im Hauptprojekt und da liegen noch einige andere Klassen, die diese Eigenschaft nicht setzen dürfen.
    Wenns keine Möglichkeit gibt werde ichs einfach mit Friend regeln, da ich sowieso der einzige bin, der das verwendet. Aber designtechnisch wäre das eigentlich ein Fehler.
    Also mir persönlich würde nur diese Lösung einfallen, wenn dus so machen musst, ich würds aber anders regeln.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim x As New blub
    4. x.Hallo = New Hallotype(19, Me)
    5. MessageBox.Show(x.Hallo.HalloInt.ToString)
    6. End Sub
    7. End Class
    8. Public Class blub
    9. Private defInt As Hallotype
    10. Public Sub New()
    11. End Sub
    12. Public Property Hallo As Hallotype
    13. Get
    14. Return defInt
    15. End Get
    16. Set(value As Hallotype)
    17. defInt = value
    18. End Set
    19. End Property
    20. End Class
    21. Public Class Hallotype
    22. Public Property HalloInt As Integer = 0
    23. Public Sub New(ByVal Intval As Integer, ByVal calltype As Object)
    24. HalloInt = Intval
    25. If calltype IsNot Form1 Then
    26. Throw New Exception
    27. End If
    28. End Sub
    29. End Class
    @Gonger96
    Das ist leider nur ne halbe Lösung, denn ich will den Zugriff nicht auf ein bestimmtes Objekt, sondern auf alle Instanzen eine bestimmten Klasse beschränken. Und den calltype zu übergeben ist, wie du selbst sagst, nicht so das Wahre.
    Danke trotzdem.
    Also mir würde sonst keine wirkliche Lösung einfallen. An irgendeiner Stelle muss ja der Zugriff genau für die eine Klasse durchgeführt werden und A ist ja auch nicht besonders gegenüber anderen Klassen des Moduls.
    Normalerweise lagert man solche Sachen ja eigentlich eh in Dlls aus, wenn es losgelöst ist, von der anwendungsspezifischen Darstellung.

    Gruß
    ~blaze~
    Ich brauche das halt nur für diese Anwendung. Mir ist zwar gerade eingefallen, dass ich es über Relection prüfen könnte, das frisst mir jedoch zu viel Preformance. Ich werde es jetzt einfach mit Friend machen, da ja eh nur ich selbst an dem Code sitze kann ich sicherstellen, dass es von nirgends sonst aufgerufen wird.
    Danke an alle.
    Reflection wär nichts. Hab' mir vorhin auch überlegt, dass man es damit machen könnte, aber das ist total unsauber. Man muss aber im Hintergrund behalten, dass ein Angreifer das per Reflection setzen kann. Ich mache sowas auch immer per Friend. Wenn niemand außer mir auf die Sachen zugreifen kann, ist das ja eigentlich genau das, was man braucht.

    Gruß
    ~blaze~