Gibt es eine Möglichkeit, einen Wert zugänglich nur für die Eltern einer verschachtelten Klasse VB.NET zu machen?

StackOverflow https://stackoverflow.com/questions/1040149

Frage

In der Regel nach dem OOP-Paradigma, mein Verständnis der Kapselung im Grunde sagt:

  1. Wenn ein Mitglied privat ist, kann es nur von der Klasse zugegriffen werden.
  2. Wenn ein Mitglied geschützt ist, kann es nur von der Basisklasse und alle abgeleiteten Klassen zugegriffen werden.
  3. Wenn ein Mitglied der Öffentlichkeit ist, kann sie von jedermann zugegriffen werden.

Wenn ich eine verschachtelte Klasse haben, können deklarieren ich eine Immobilie zugänglich zu sein, nur zu dieser Klasse und der übergeordneten Klasse innerhalb verschachtelt ist? Zum Beispiel:

Public Class ContainerClass
    Public Class NestedClass
        Protected myInt As Integer ' <- this is what I am wondering about '
        Protected myDbl As Double ' <- this is what I am wondering about '

        Sub New()
            myInt = 1
            myDbl = 1.0
        End Sub
    End Class

    Private myNestedObject As New NestedClass

    ' this function is illegal '
    Public Sub GrowNestedObject(ByVal multiplier As Integer)
        myNestedObject.myInt *= multiplier
        myNestedObject.myDbl *= multiplier
    End Sub
End Class

Im Beispiel kann es nicht direkt zugreifen myNestedObject.myInt oder myNestedObject.myDbl von einer Instanz von ContainerClass, wenn diese Mitglieder Privat oder geschützt sind. Aber angenommen, ich will nicht, sie öffentlich machen, denn dann sind sie zu ausgesetzt: sie können von jedem beliebigen Ort geändert werden, nicht nur innerhalb eines ContainerClass Objekt. sie Freund Deklarieren noch wäre zu schwach, als dass würde es ihnen ermöglichen, von überall in der Anwendung geändert werden.

Gibt es eine Möglichkeit zu erreichen, was ich denn hier werde? Wenn nicht, kann sich jemand einen sinnvollen Weg, so etwas zu erreichen?

War es hilfreich?

Lösung

Es gibt keine Möglichkeit, dies mit einer Kombination aus Zugänglichkeit Modifikatoren direkt zu tun.

Der beste Weg, ich, dies zu tun denken kann, ist wie folgt. Es geht um eine zusätzliche Zwischenstufe.

  • Erstellen Sie eine Nested-Schnittstelle mit eigenem Zugang. Dies gibt nur die übergeordnete Klasse und verschachtelte Kinder Zugang
  • Fügen Sie die Felder, die Sie
  • auf diese Schnittstelle zugreifen wollen
  • Stellen Sie die Nested-Klasse implementieren die Schnittstelle
  • Machen Sie alle von den Implementierungen haben private Zugänglichkeit

Nun ist die übergeordnete Klasse und nur die Elternklasse wird den Zugriff auf diese Eigenschaften und Methoden haben.

Beispiel:

Class Parent
    Private Interface Interface1
        ReadOnly Property Field1() As Integer
    End Interface

    Public Class Nested1
        Implements Interface1

        Private ReadOnly Property Field1() As Integer Implements Interface1.Field1
            Get
                Return 42
            End Get
        End Property
    End Class

    Sub New()
        Dim child As Interface1 = New Nested1
        Dim x = child.Field1
    End Sub
End Class

Andere Tipps

Basierend auf JaredPar Antwort, könnten Sie eine Privatchild aber eine öffentliche Schnittstelle verwenden, die nur zeigt, was sie zeigen Sould:

    Public Class ParentClass

        Public Interface IChildClass
            ReadOnly Property i() As Integer
            Sub SomeSub()
        End Interface

        Private Class ChildClass
           Implements IChildClass
           Public myInt As Integer 

           Public ReadOnly Property i() As Integer Implements IChildClass.i
               Get
                   Return myInt
               End Get
           End Property

           Public Sub SomeSub() Implements IChildClass.SomeSub
           End Sub
        End Class

    Public Shared Function GetNewChild() As IChildClass
        Dim myChild = New ChildClass()
        myChild.myInt = 3
        Return myChild
    End Function
End Class

Verbrauch:

Dim c As ParentClass.IChildClass = ParentClass.GetNewChild()
MessageBox.Show(c.i)
c.i = 2 ' Does not compile !
c.SomeSub()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top