如何仅允许特定类访问类属性?附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
相关产品推荐
相关产品推荐

