هل هناك طريقة لجعل قيمة يمكن الوصول إليها إلا الوالد من فئة متداخلة VB.NET?

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

سؤال

في عام ، وفقا 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

في المثال, لا يمكن الوصول مباشرة إلى myNestedObject.مينت أو myNestedObject.myDbl من مثيل ContainerClass إذا كان هؤلاء الأعضاء الخاصة أو المحمية.ولكن لنفترض أنا لا تريد أن تجعل لهم ، ومن ثم فهي تتعرض أيضا:فإنها يمكن أن تغير من في أي مكان ، ليس فقط داخل ContainerClass الكائن.معلنا لهم صديق لا يزال ضعيفا جدا كما أن من شأنها أن تسمح لهم أن تتغير من أي مكان داخل التطبيق.

هل هناك أي طريقة لإنجاز ما أنا هنا ؟ إذا لا يمكن أن يفكر أحد أكثر طريقة معقولة لتحقيق شيء ما مثل هذا ؟

هل كانت مفيدة؟

المحلول

ليس هناك طريقة للقيام بذلك مباشرة مع مزيج من الوصول المعدلات.

أفضل طريقة أستطيع أن أفكر في القيام بذلك على النحو التالي.فإنه ينطوي على مستوى إضافي من المراوغة.

  • إنشاء متداخلة واجهة خاصة مع إمكانية الوصول.هذا سيعطي فقط الطبقة الأم و متداخلة الأطفال الوصول
  • إضافة الحقول التي تريد الوصول إلى تلك الواجهة
  • جعل فئة متداخلة تنفيذ واجهة
  • جعل جميع تطبيقات خاصة للمعاقين

الآن الطبقة الأم فقط الطبقة الأم من الوصول إلى تلك الخصائص والأساليب.

على سبيل المثال:

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

نصائح أخرى

على أساس JaredPar الجواب, هل يمكن استخدام خاص ChildClass ولكن الجمهور واجهة يكشف إلا ما 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

الاستخدام :

Dim c As ParentClass.IChildClass = ParentClass.GetNewChild()
MessageBox.Show(c.i)
c.i = 2 ' Does not compile !
c.SomeSub()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top