You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅允许特定类访问类属性?附VB.NET类代码示例

实现仅允许特定类访问类属性的VB.NET方案

嘿,看起来你是想让lbMenuItem的Owner和Header属性只能被lbMenu类操作,不让其他外部代码随便碰对吧?我给你整理了两种实用的实现方式,你可以根据自己的代码结构选:

方法一:把lbMenuItem嵌套进lbMenu类里

这是最严格的限制方式,直接把lbMenuItem变成lbMenu的内部嵌套类,这样lbMenu能直接访问它的私有成员,外部代码连lbMenuItem的存在都看不到:

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

    ' 嵌套的lbMenuItem,只有lbMenu能访问它的内容
    Private Class lbMenuItem
        Inherits Control
        ' 用Private或者Friend都行,lbMenu都能访问
        Private _Owner As lbMenu
        Private _Header As String

        ' 比如重写OnPaint来绘制标题
        Protected Overrides Sub OnPaint(e As PaintEventArgs)
            MyBase.OnPaint(e)
            e.Graphics.DrawString(_Header, Font, Brushes.Black, New Point(5, 5))
        End Sub
    End Class
End Class

这样外部代码根本没法创建lbMenuItem实例,更别说修改它的属性了,封装性拉满。

方法二:用私有访问器+限定构造函数(不想嵌套的话)

如果不想把类嵌套,那可以把lbMenuItem的敏感属性设为只读,并且只给lbMenu开放创建和修改的入口:

Public Class lbMenu
    Inherits Form

    Public Sub AddItem(header As String)
        ' 调用lbMenuItem的内部构造函数创建实例
        Dim item As New lbMenuItem(Me, header)
        Controls.Add(item)
    End Sub

    ' 如果后续要修改标题,就加个公共方法调用lbMenuItem的更新方法
    Public Sub UpdateItemHeader(item As lbMenuItem, newHeader As String)
        item.UpdateHeader(newHeader)
    End Sub
End Class

Public Class lbMenuItem
    Inherits Control
    Private _Owner As lbMenu
    Private _Header As String

    ' 只有同程序集的lbMenu能调用这个构造函数
    Friend Sub New(owner As lbMenu, header As String)
        _Owner = owner
        _Header = header
    End Sub

    ' 只读属性,外部只能看不能改(如果连看都不想让外部看,就把Friend改成Private)
    Friend ReadOnly Property Owner As lbMenu
        Get
            Return _Owner
        End Get
    End Property

    Friend ReadOnly Property Header As String
        Get
            Return _Header
        End Get
    End Property

    ' 只有同程序集的lbMenu能调用这个方法修改标题
    Friend Sub UpdateHeader(newHeader As String)
        _Header = newHeader
        Invalidate() ' 触发重绘
    End Sub
End Class

这里用Friend修饰符限定了构造函数和更新方法的访问范围,只有同程序集里的lbMenu能操作lbMenuItem的核心属性,外部代码只能通过lbMenu提供的公共接口来干活。

小提示

  • 优先选嵌套类的方式,隔离性最好,不容易出问题
  • 尽量缩小属性和方法的访问范围,能不用Public就不用,保证代码的安全性和可维护性

内容的提问来源于stack exchange,提问作者lucasugar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:12:48