我正在尝试找出在我正在创建的嵌套类中设置和获取属性的最佳方法。
我有一个类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
答案 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;
摩托车怎么样?它不是一辆车,但它仍然有一个带有车速表的仪表板。
明白我的观点?复合对象。