2011-01-20 55 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;

摩托车怎么样?它不是一辆汽车,但它仍然有一个有速度表的仪表板。

明白我的意思吗?复合对象。