簡體   English   中英

僅從特定類訪問類屬性

[英]Access a class property only from a certain class

假設我有以下課程:

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

如您所見,我從lbMenu類訪問lbMenuItemOwner屬性。

我想要的是沒有其他人可以訪問Owner屬性,或者只是讀取該屬性的值。 我認為沒有辦法做到,但也許有解決方案可以解決類似的情況。

有什么建議么?


編輯:

我已經考慮過將所有者作為構造函數中的參數傳遞,但是我希望任何人都可以訪問lbMenuItem類。 任何人都可以創建該類的新實例,讀取和寫入許多屬性,等等。我唯一不需要的是有人可以編寫 Owner屬性。 有人可以創建類的新實例,而不必將ownerMenu參數傳遞給New方法(他不知道ownerMenu的作用)。 出於同樣的原因, lbMenuItem不能嵌套類的lbMenu 我試圖獲得與ContextMenuStripToolStripMenuItem相同的結果。 ToolStripMenuItem具有Owner屬性(在這種情況下具有讀/寫訪問權限)和OwnerItem是只讀的。 因此,是否有一種方法可以使lbMenu類的Owner屬性為只讀但可寫的?

如果要允許讀取其值並將設置在構造函數中,則可以僅將Owner屬性設為私有或只讀

編輯:

有人可以創建類的新實例,而不必將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 )。 這將使您具有能夠從lbMenuItem實例訪問lbMenu的私有成員的lbMenu

希望能有所幫助。


解決您編輯中的新問題:

ToolStripMenuItem具有Owner屬性...和一個只讀的OwnerItem

那正是我提出的(即使用只讀屬性)。 需要注意的是OwnerItem屬性不會暴露為可寫的任何其他類別。

因此,是否有一種方法可以使lbMenu類的Owner屬性為只讀但可寫的?

不,那不可能。 只讀屬性是只讀句點。 您不能將其設置器公開給特定的類。 但是,您可以通過使用關鍵字FriendPrivateProtected來限制其設置者的可訪問性:

  • Friend Set >將使setter在當前項目內部可訪問(使屬性可寫),在項目外部只讀。
  • Private Set ->將使設置者可以從子類中訪問。
  • Protected Set ->將使設置者可以從派生類訪問。

看一下這個問題 ,以更好地了解如何限制屬性設置器的可訪問性。 關於C#,但是概念是相同的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM