В целом, согласно парадигме ООП, мое понимание инкапсуляции в основном гласит:
- Если член является приватным, доступ к нему может получить только класс.
- Если член защищен, к нему может получить доступ только базовый класс и любые производные классы.
- Если участник публичный, к нему может получить доступ любой.
Если у меня есть вложенный класс, могу ли я объявить свойство доступным только для этого класса и родительского класса, в который оно вложено? Например:
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
В этом примере я не могу напрямую получить доступ к myNestedObject.myInt или myNestedObject.myDbl из экземпляра ContainerClass, если эти члены являются частными или защищенными. Но предположим, что я не хочу делать их Публичными, потому что тогда они СЛИШКОМ уязвимы: их можно изменить из любого места, а не только внутри объекта ContainerClass. Объявление их Friend по-прежнему будет слишком слабым, поскольку это позволит изменить их из любой точки приложения.
Есть ли способ выполнить то, что я собираюсь здесь? Если нет, то может ли кто-нибудь придумать более разумный способ добиться чего-то подобного?