2011-01-20 54 views
8

我想弄清楚在我創建的嵌套類中設置和獲取屬性的最佳方法。.NET中屬性的嵌套類訪問方法

我有一個類,汽車有一個嵌套類ControlPanel,並希望使控制面板的屬性只能訪問汽車和控制面板類。

(即:不在程序集或命名空間內,不在應用程序內,類庫將被使用)...我已將類訪問屬性更改爲朋友,受保護的朋友,私人,公共,但任何組合不符合我的預期結果。

我想改變Drive()子類中的屬性,如下所示。

有什麼想法?

Public Class Car 

    Dim cp As New ControlPanel 

    Public Class ControlPanel 
     Private _Speedometer As Integer = 0 
     Private _Odometer As Integer = 0 

     Public Property Speedometer() As Integer 
     Get 
      Return _Speedometer 
     End Get 
     Protected Set(ByVal value As Integer) 
      _Speedometer = value 
     End Set 
     End Property 

     Public Property Odometer() As Integer 
     Get 
      Return _Odometer 
     End Get 
     Protected Set(ByVal value As Integer) 
      _Odometer = value 
     End Set 
    End Property 

    End Class 

    Public Sub Drive() 

     cp.Odometer = 76323 
     co.Speedometer = 86 

    End Sub 

End Class 
+0

你能擴展你的問題嗎?您希望*整個ControlPanel類*是不可訪問的,還是您希望*只有這兩個屬性*不能從Car以外的任何類訪問?另外,你的代碼似乎表明你希望獲得不同的getter和setter訪問權限,但是在這個問題中你沒有清楚地說明這一點。你想爲getter和setter設置不同的訪問權限嗎? – Cheeso 2011-01-20 02:34:20

+0

爲混淆道歉。我想看到的是ControlPanel只能從Car類外部讀取,而在Car和Control Panel類中則是Read/Write。 – 2011-01-20 03:09:34

+0

根據該評論,我認爲你正在尋找的是我所建議的具有公共(或朋友)接口的私有嵌套類。這將確保Car類可以訪問ControlPanel上的所有成員,但外部只會保留只會暴露獲取的IControlPanel的引用。如果Car以外的東西可以檢驗ControlPanel類,則可能需要某種形式的工廠方法(Create),它返回IControlPanel。 – 2011-01-20 13:55:27

回答

3

你可以這樣說:

Public Class Car 

    Private Interface IControlPanel 
    Property Odometer As Integer 
    Property Speedometer As Integer 
    End Interface 

    Public Class ControlPanel 
    Implements IControlPanel 
    Public ReadOnly Property Odometer As Integer 
     Get 
     Return CType(Me, IControlPanel).Odometer 
     End Get 
    End Property 
    Public ReadOnly Property Speedometer As Integer 
     Get 
     Return CType(Me, IControlPanel).Speedometer 
     End Get 
    End Property 
    Private Property IControlPanel_Odometer As Integer Implements IControlPanel.Odometer 
    Private Property IControlPanel_Speedometer As Integer Implements IControlPanel.Speedometer 
    End Class 

    Dim cp As IControlPanel = New ControlPanel() 

    Public Sub Drive() 
    cp.Odometer = 76323 
    cp.Speedometer = 86 
    End Sub 

End Class 

它使用嵌套在Car類私有實現和別名成員ControlPanel專用接口。這樣,只有Car可以訪問接口成員。

0

首先,讓我們來澄清一下術語。你在這裏討論的是一個「嵌套」類而不是子類

我不相信你在.NET中可能做什麼。但是,你真的需要它嗎?如果cp在車內是私密的,則沒有人可以在該車的控制面板上增加里程表。他們可以創建自己的控制面板,而不是汽車的一部分,然後把它弄亂,但是這有什麼危害?

+0

我製作了ControlPanel Private,但Car類中的屬性使其可用。即:(MyCar.ControlPanel.Odometer) – 2011-01-20 03:17:46

4

正如羅伯特·利維指出的那樣,你指的是一個「嵌套類」,而不是「子類」等

至於如何實現你在找什麼...你只是希望使ControlPanel是一個私人類嗎?這將確保ControlPanel的所有成員只能通過Car訪問。如果ControlPanel上的其他成員需要公開,或者外部世界需要在某種程度上持有對ControlPanel的引用,請考慮使用一個接口來公開只有那些您希望公開可用的成員。

Public Class Car 

    Dim cp As New ControlPanel 

    Private Class ControlPanel 

    Public Property Speedometer As Integer 
    Public Property Odometer As Integer 

    End Class 

    Public Sub Drive() 
    cp.Odometer = 76323 
    cp.Speedometer = 86 
    End Sub 

End Class 

可選...

Friend Interface IControlPanel 
    //Whatever actually needs to be publically accessible.  
End Interface 

// Other Code... 

Private Class ControlPanel 
    Implements IControlPanel 

// Other Code... 

什麼是您試圖在API方面要達到的目標?

+0

我試圖實現的目的是模塊化。我不想在汽車級別創建100個屬性,而是想將彼此相關的特性分解到這些「文件夾」類中。 – 2011-01-20 03:14:39

0

使您的ControlPanel類私人及其屬性公開。 ControlPanel類將僅對Car類型可見,但Car仍將能夠修改ControlPanel的屬性。

0

嵌套類是一種方法,或者您可以將您的Car作爲複合類。控制面板可以用於許多不同的汽車(子類),爲什麼要嵌套?汽車有一個控制面板。汽車有引擎

巴士:汽車也有這些東西。

無線電可能是控制面板的東西。速度計可以是儀表板的一部分,也可以是控制面板的一部分。

那麼你最終

MyCar.ItsControlPanel.Radio MyCar.ItsControlPanel.Dashboard.Speedometer.CurrentSpeed;

摩托車怎麼樣?它不是一輛汽車,但它仍然有一個有速度表的儀表板。

明白我的意思嗎?複合對象。