嵌套类.NET中属性的访问方法

时间:2011-01-20 02:04:52

标签: .net vb.net access-modifiers

我正在尝试找出在我正在创建的嵌套类中设置和获取属性的最佳方法。

我有一个类Car,它有一个嵌套类ControlPanel,并且只想让控制面板的属性可以访问Car和Control Panel类。

(即:不在程序集或命名空间内,不在应用程序中将使用类库)...我已将类访问属性更改为朋友,受保护的朋友,私有,公共,但任何组合与我的预期结果不符。

我想更改类的Drive()Sub中的属性,如下所示。

有什么想法吗?

 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

5 个答案:

答案 0 :(得分:4)

正如Robert Levy指出的那样,你指的是“嵌套类”,而不是“子类”等。

至于如何实现您正在寻找的......您是否只是想让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方面实现的目标是什么?

答案 1 :(得分: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可以访问接口成员。

答案 2 :(得分:0)

首先,让我们澄清一下术语。你在这里谈论的是一个“嵌套”类而不是子类

我不相信你想要做的事情在.NET中是可能的。但是,你真的需要吗?如果cp在Car内是私人的,那么没有人可以在该车的控制面板上增加里程表。他们可以创建自己的控制面板,这些控制面板不是汽车的一部分然后搞砸了,但这有什么害处呢?

答案 3 :(得分:0)

将您的ControlPanel课程设为私有,并将其属性设为公开。然后ControlPanel类仅对Car类型可见,但Car仍然可以修改ControlPanel的属性。

答案 4 :(得分:0)

嵌套类是一种方法,或者您可以将Car作为复合类。控制面板可用于许多不同的汽车(子类),为什么要嵌套?汽车有一个控制面板。汽车有引擎

公共汽车:汽车也有这些东西。

无线电可能是控制面板所具有的功能。车速表可以是仪表板的一部分,也可以作为控制面板的一部分。

然后你最终得到了

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

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

明白我的观点?复合对象。