Gibt es eine Möglichkeit, einen Wert zugänglich nur für die Eltern einer verschachtelten Klasse VB.NET zu machen?
-
22-07-2019 - |
Frage
In der Regel nach dem OOP-Paradigma, mein Verständnis der Kapselung im Grunde sagt:
- Wenn ein Mitglied privat ist, kann es nur von der Klasse zugegriffen werden.
- Wenn ein Mitglied geschützt ist, kann es nur von der Basisklasse und alle abgeleiteten Klassen zugegriffen werden.
- 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?
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()