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

Posted

技术标签:

【中文标题】.NET 中属性的嵌套类访问方法【英文标题】:Nested class Access methods for Properties in .NET 【发布时间】:2011-06-12 04:26:20 【问题描述】:

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

我有一个类 Car,它有一个嵌套类 ControlPanel,我想让控制面板的属性只能由 Car 和控制面板类访问。

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

我想更改类的 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

【问题讨论】:

你能扩展你的问题吗?您希望 整个 ControlPanel 类 无法访问,还是希望 只有这两个属性 无法从 Car 以外的任何类访问?此外,您的代码似乎建议您希望对 getter 和 setter 进行不同的访问,但您没有在问题中明确说明这一点。您是否也希望 getter 和 setter 具有不同的访问权限? 为混乱道歉。我想看到的是 ControlPanel 在 Car 类之外是只读的,但在 Car 和 Control Panel 类中是读/写的。 基于该评论,我认为您正在寻找的是我建议的具有公共(或朋友)接口的私有嵌套类。这将确保 Car 类可以访问 ControlPanel 上的所有成员,但外部只会保留 IControlPanel 的引用,该引用只会公开获取。如果 Car 以外的东西可以实例化 ControlPanel 类,您可能需要某种形式的工厂方法 (Create) 来返回 IControlPanel。 【参考方案1】:

正如 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 方面试图实现的目标是什么?

【讨论】:

我想要达到的目的是模块化。我不想在 Car 级别创建 100 个属性,而是想将彼此相关的属性分解为这些“文件夹”类。【参考方案2】:

你可以这样做:

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可以访问接口成员。

【讨论】:

【参考方案3】:

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

我不相信您尝试做的事情在 .NET 中是可能的。然而,你真的需要吗?如果 cp 在 Car 中是私有的,则没有人可以增加该汽车控制面板上的里程表。他们可以创建自己的不属于汽车的控制面板,然后搞砸它,但这样做有什么害处?

【讨论】:

我已将 ControlPanel 设为私有,但 Car 类中的属性使其可用。即:(MyCar.ControlPanel.Odometer)【参考方案4】:

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

【讨论】:

控制面板仍应在 Car 类之外以只读方式公开可用。控制面板应该可以读取/写入控制面板。 里程表和速度表的值也是占位符值。这些字段将链接到数据库,并可根据要求显示。 (即:MyCar.ControlPanel.Speedometer)【参考方案5】:

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

公交车:车也有这些东西。

收音机可能是控制面板拥有的东西。车速表可以是仪表板的一部分,也可以是控制面板的一部分。

然后你会得到

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

摩托车呢?它不是汽车,但它仍然有一个仪表板,上面有一个速度计。

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

【讨论】:

以上是关于.NET 中属性的嵌套类访问方法的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让一个值只能被嵌套类 VB.NET 的父级访问?

如何使用外部类的实例访问嵌套类的属性[重复]

内部类

Swift 嵌套类属性

protobuf-net 嵌套类支持?订单注释?

Kotlin基础-可见修饰符嵌套类