假设我有以下课程:
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
的嵌套类。
我试图获得与lbMenu
和ContextMenuStrip
相同的结果。 ToolStripMenuItem
具有ToolStripMenuItem
属性(在这种情况下具有读/写访问权限)和Owner
是只读的。
那么,有没有办法让OwnerItem
属性为只读但可以从Owner
类写入?
答案 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
的私有成员。
希望有所帮助。
ToolStripMenuItem
有Owner
属性...和OwnerItem
是只读的。
这正是我提出的(即使用只读属性)。请注意,OwnerItem
属性未作为可写公开给任何其他类。
那么,有没有办法让
Owner
属性为只读但可写 来自lbMenu
类?
不,那是不可能的。只读属性是只读的,句点。您无法将其setter暴露给特定的类。但是,您可以使用关键字Friend
,Private
或Protected
限制其设置者的辅助功能:
Friend Set
- >将使setter可访问(使属性可写)在当前项目中,并在项目外只读。Private Set
- >将使子类可以访问setter。Protected Set
- >将使派生者可以从派生类中访问。查看this question以更好地了解如何限制属性设置器的可访问性。 这是关于C#,但概念是相同的。