Есть ли способ сделать значение доступным только для родителя вложенного класса VB.NET? - PullRequest
2 голосов
/ 24 июня 2009

В целом, согласно парадигме ООП, мое понимание инкапсуляции в основном гласит:

  1. Если член является приватным, доступ к нему может получить только класс.
  2. Если член защищен, к нему может получить доступ только базовый класс и любые производные классы.
  3. Если участник публичный, к нему может получить доступ любой.

Если у меня есть вложенный класс, могу ли я объявить свойство доступным только для этого класса и родительского класса, в который оно вложено? Например:

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 по-прежнему будет слишком слабым, поскольку это позволит изменить их из любой точки приложения.

Есть ли способ выполнить то, что я собираюсь здесь? Если нет, то может ли кто-нибудь придумать более разумный способ добиться чего-то подобного?

Ответы [ 2 ]

4 голосов
/ 24 июня 2009

Нет способа сделать это напрямую с помощью комбинации модификаторов доступности.

Лучший способ, которым я могу думать об этом, заключается в следующем. Это предполагает дополнительный уровень косвенности.

  • Создание вложенного интерфейса с приватной доступностью. Это даст только родительскому классу и вложенным детям доступ
  • Добавьте поля, к которым вы хотите получить доступ к этому интерфейсу
  • Заставить вложенный класс реализовать интерфейс
  • Сделать все реализации доступными для частного использования

Теперь родительский класс и только родительский класс будут иметь доступ к этим свойствам и методам.

Например:

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
0 голосов
/ 24 июня 2009

Исходя из ответа JaredPar, вы можете использовать Private ChildClass, но Public Interface, который показывает только то, что он должен показать:

    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

Использование:

Dim c As ParentClass.IChildClass = ParentClass.GetNewChild()
MessageBox.Show(c.i)
c.i = 2 ' Does not compile !
c.SomeSub()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...