هل هناك طريقة لجعل قيمة يمكن الوصول إليها إلا الوالد من فئة متداخلة VB.NET?
-
22-07-2019 - |
سؤال
في عام ، وفقا OOP النموذج ، فهم التغليف الأساس يقول:
- إذا كان العضو هو خاص ، فإنه يمكن الوصول إليها فقط من قبل الطبقة.
- إذا كان العضو محمي ، فإنه يمكن الوصول إليها فقط من قبل فئة القاعدة وأي الفئات المشتقة.
- إذا كان العضو هو الجمهور ، ويمكن الوصول إليها من قبل أي شخص.
إذا كان لدي فئة متداخلة ، أعلن خاصية أن يكون موجودا إلا أن تلك الفئة و الفئة الأصل أنها متداخلة داخل ؟ على سبيل المثال:
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()