2014-06-07 59 views
-1

在課堂之外,我希望能夠訪問CCTV.Camera.Brightness屬性爲ReadOnly,但CCTV類中的方法應該能夠修改「亮度」屬性。請你能提供如何實現這個建議嗎?嵌套類和只讀屬性

我想我需要添加一個接口,公開一些屬性並隱藏其他,但我不確定實現。 [注意這個例子和測試中的構造函數和main子函數是明顯的設計]。

Public Class CCTV 

    Public Class Camera 
     Public Property Name as String 
     Public Property Brightness as Integer 
    End Class 

    Dim cameras as New Dictionary(Of String, Camera) 
    Public Sub New() 
     Dim cam As New Camera 
     cam.Name = "driveway" 
     cam.Brightness = 5 
     cameras.Add(cam.Name, cam) 
    End Sub 

    Public Sub ChangeBrightness(value as Integer) 
     cameras("driveway").Brightness = value 
    End Sub 

End Class 

Sub main() 
    Dim MyCCTV = new CCTV 
    MyCCTV.ChangeBrightness(10) 
    if MyCCTV("driveway").Brightness = 10 then Console.Write("Brightness is 10") 
End Sub 

回答

1

獲取的getter和setter方法可以有不同的可訪問性修飾符。在這種情況下,您希望每個人都可以讀取Brightness,但只有您信任的代碼應該能夠編寫它。你這樣做是這樣的:

Public Class Camera 
    Private _brightness As Integer 

    Public Property Brightness As Integer 
     Get 
      Return _brightness 
     End Get 
     Friend Set(value As Integer) 
      _brightness = Value 
     End Set 
    End Property 

    '' etc... 
End Class 

注意添加Friend關鍵字,它限制訪問代碼在Camera類是一部分的同一個項目。如果您想限制訪問Camera類或其派生類中的代碼,它也可以是PrivateProtected

0

接口沒有需要在這個case.You只需創建您的財產readonly.when你設置屬性爲只讀假設值將存儲在私有變量中,並在這一點上應該是更好的通它或使用重載方法的方法或將subnew讓我告訴你一個例子:

Public Class CCTV 

Public Class Camera 
    Private _Name As String 
    Public Property Name() As String 
     Get 
      Return _Name 
     End Get 
     Set(ByVal value As String) 
      _Name = value 
     End Set 
    End Property 


    Private _Brightness As String 
    Public ReadOnly Property Brightness() As String 
     Get 
      Return _Brightness 
     End Get 

    End Property 
    ''' <summary> 
    ''' Defautl sub new method 
    ''' </summary> 
    ''' <remarks></remarks> 
    Sub New() 

    End Sub 
    ''' <summary> 
    ''' second overload 
    ''' </summary> 
    ''' <param name="cameraName"></param> 
    ''' <param name="brightness"></param> 
    ''' <remarks></remarks> 
    Sub New(ByVal cameraName As String, ByVal brightness As Integer) 
     Me.Name = cameraName 
     Me._Brightness = brightness 
    End Sub 

    ''' <summary> 
    ''' Change brigthness 
    ''' </summary> 
    ''' <param name="value"></param> 
    ''' <remarks></remarks> 
    Public Sub setUpCameraBrightness(ByVal value As Integer) 
     'take care to use private varibale so it will reflcet changes into propetry readonly 
     Me._Brightness = value 
    End Sub 
End Class 

Dim cameras As New Dictionary(Of String, Camera) 
Public Sub New() 
    'two differnet approach 
    'first overaload: 
    Dim cam As New Camera() 
    cam.Name = "yourcamname" 
    cam.setUpCameraBrightness(10) 
    cameras.Add(cam.Name, cam) 



    ''second approch declarative value: 
    Dim cam2 As New Camera("yourcamname", 10) 
    cameras.Add(cam2.Name, cam2) 

End Sub 

Public Sub ChangeBrightness(value As Integer) 
    cameras("driveway").setUpCameraBrightness(100) 
End Sub 

End Class 

Sub main() 
    Dim MyCCTV = New CCTV 
    MyCCTV.ChangeBrightness(10) 
    If MyCCTV("driveway").Brightness = 10 Then Console.Write("Brightness is 10") 
End Sub