2

一般に、OOP パラダイムによると、カプセル化に関する私の理解は基本的に次のように述べています。

  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

この例では、これらのメンバーが Private または Protected の場合、ContainerClass のインスタンスから myNestedObject.myInt または myNestedObject.myDbl に直接アクセスすることはできません。しかし、それらをパブリックにしたくないとします。なぜなら、あまりにも公開されてしまうからです。これらは、ContainerClass オブジェクト内だけでなく、どこからでも変更できます。それらを Friend として宣言しても、アプリケーション内のどこからでも変更できるため、依然として弱すぎます。

私がここで行っていることを達成する方法はありますか? そうでない場合、このようなことを達成するためのより賢明な方法を考えられる人はいますか?

4

2 に答える 2

4

アクセシビリティ修飾子を組み合わせて直接これを行う方法はありません。

これを行うための最良の方法は次のとおりです。これには、余分なレベルの間接化が含まれます。

  • Private アクセシビリティを使用してネストされたインターフェイスを作成します。これにより、親クラスとネストされた子のアクセスのみが許可されます
  • アクセスしたいフィールドをそのインターフェースに追加します
  • ネストされたクラスにインターフェースを実装させる
  • すべての実装にプライベート アクセシビリティを持たせる

これで、親クラスと親クラスのみがこれらのプロパティとメソッドにアクセスできるようになります。

例えば:

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
于 2009-06-24T18:45:05.363 に答える