仅从某个类访问类属性

时间:2018-04-05 17:28:43

标签: vb.net

假设我有以下课程:

Public Class lbMenu

    Inherits Form

    ...

    Public Sub AddItem(header As String)
        Dim item As New lbMenuItem()
        item.Owner = Me
        item.Header = header
        Controls.Add(item)
    End Sub

    ...

End Class

以及以下课程:

Public Class lbMenuItem

    Inherits Control

    Private _Owner As lbMenu
    Public Property Owner As lbMenu
        Get
            Return _Owner
        End Get
        Set(value As lbMenu)
            _Owner = value
        End Set
    End Property

    Private _Header As String
    Public Property Header As String
        Get
            Return _Header
        End Get
        Set(value As String)
            _Header = value
        End Set
    End Property

    ...

End Class

如您所见,我从班级Owner访问lbMenuItem的{​​{1}}媒体资源。

我想要的是没有其他人可以访问lbMenu属性,或者只是读取属性的值。我认为没有办法做到这一点,但也许有解决方案可以达到类似的情况。

有什么建议吗?

修改

我已经考虑过将所有者作为构造函数中的参数传递,但我希望任何人都可以访问Owner类。任何人都可以创建一个新的类实例,读取和写入许多属性等。我唯一不想要的是有人可以编写 lbMenuItem属性。有人可以创建该类的新实例,而无需将Owner参数传递给ownerMenu方法(他无法知道New的用途)。出于同样的原因,ownerMenu不能是lbMenuItem的嵌套类。 我试图获得与lbMenuContextMenuStrip相同的结果。 ToolStripMenuItem具有ToolStripMenuItem属性(在这种情况下具有读/写访问权限)和Owner是只读的。 那么,有没有办法让OwnerItem属性为只读但可以从Owner类写入?

1 个答案:

答案 0 :(得分:0)

如果要允许读取其值并在构造函数中设置它,您可以将Owner属性设为private 或只读。

修改

  

有人可以创建该类的新实例而无需传递   ownerMenu方法的New参数

好吧,你可以有两个构造函数,一个接受lbMenu参数,一个不接受。所以,你的代码看起来像这样:

Public Class lbMenu

    Public Sub AddItem(header As String)
        Dim item As New lbMenuItem(Me)
        item.Header = header
        Controls.Add(item)
    End Sub

End Class

Public Class lbMenuItem

    ' Use this instead if you don't want the property to be accessible at all.
    'Private Property Owner As lbMenu

    Public ReadOnly Property Owner As lbMenu
    Public Property Header As String

    ' Allow creating an instance of the class without having to pass/set the owner.
    Public Sub New()
    End Sub

    Public Sub New(ownerMenu As lbMenu)
        Owner = ownerMenu
    End Sub

End Class

最后一条建议:

根据类的名称,您可能会考虑在它们之间建立父/子关系(即lbMenuItem类将是lbMenu中的嵌套类)。这将使您能够从lbMenu实例访问lbMenuItem的私有成员。

希望有所帮助。

解决编辑中的新点:

  

ToolStripMenuItemOwner属性...和OwnerItem是只读的。

这正是我提出的(即使用只读属性)。请注意,OwnerItem属性未作为可写公开给任何其他类。

  

那么,有没有办法让Owner属性为只读但可写   来自lbMenu类?

不,那是不可能的。只读属性是只读的,句点。您无法将其setter暴露给特定的类。但是,您可以使用关键字FriendPrivateProtected限制其设置者的辅助功能:

  • Friend Set - >将使setter可访问(使属性可写)在当前项目中,并在项目外只读。
  • Private Set - >将使子类可以访问setter。
  • Protected Set - >将使派生者可以从派生类中访问。

查看this question以更好地了解如何限制属性设置器的可访问性。 这是关于C#,但概念是相同的