编程VB.NET开发者 / 库开发者

如何在Visual Basic中实现、验证和限制对私有(private)和保护(protected)方法和字段的访问?在一个类、派生类和其他程序集中的访问特点是什么?

用 Hintsage AI 助手通过面试

回答。

问题的背景

封装是面向对象编程的支柱之一,它通过访问修饰符如PrivateProtected来实现。在经典版本的Visual Basic中,仅支持最简单的可见性级别,但随着VB.NET的出现,出现了类似于C#的现代机制。

问题

主要任务是将内部实现细节与外部代码隔离,包括其他程序部分。典型错误与不正确的访问级别、尝试访问超出许可可见性范围的字段和方法或对Protected和它与其他修饰符组合的行为的误解有关。

解决方案

支持以下修饰符:

  • Private — 仅在当前类/模块内可访问
  • Protected — 在当前类及所有继承者中可访问(即使在其他程序集)
  • Friend — 在同一程序集内可访问
  • Protected Friend — 在继承者或同一程序集内可访问

代码示例:

Public Class BaseClass Private Sub PrivateMethod() Console.WriteLine("PrivateMethod") End Sub Protected Sub ProtectedMethod() Console.WriteLine("ProtectedMethod") End Sub Friend Sub FriendMethod() Console.WriteLine("FriendMethod") End Sub Protected Friend Sub ProtectedFriendMethod() Console.WriteLine("ProtectedFriendMethod") End Sub End Class Public Class DerivedClass Inherits BaseClass Public Sub AccessMethods() 'PrivateMethod() '编译错误 ProtectedMethod() '可以 FriendMethod() '可以,如果在同一程序集 ProtectedFriendMethod() '可以 End Sub End Class

关键特点:

  • Private修饰符将可见性限制在类的范围内
  • Protected在所有继承类中有效,无论在任何程序集
  • Protected Friend结合了两者规则

有陷阱的问题。

可以通过派生类访问private字段吗?

不可以,private成员始终只能在声明它们的类内访问。派生类即使通过反射也无法访问private成员(如果不使用非常规方式)。

Protected与Protected Friend有什么区别?

Protected — 仅在类及其后代中可访问,即使在其他程序集;Protected Friend — 可来自派生类或同一程序集内的任何代码。

可以通过基类实例访问类的protected方法吗?

不可以,即使protected方法在继承类中是公开的,也不能从外部代码通过基类实例调用。Protected方法仅在类本身或其继承中可用。

常见错误和反模式

  • 将所有方法开放为public或friend以加快速度
  • 在应使用private属性的地方使用protected字段
  • 因过于宽松的访问而破坏封装

真实案例

负面案例

开发者为了简化测试,将内部字段设置为public,以便可以直接从外部代码或单元测试中访问。随着时间的推移,其他调用开始使用这些字段,依赖于它们的内部结构。

优点:

  • 快速测试
  • 访问代码更少

缺点:

  • 封装性弱
  • 内部实现变更时缺陷增加
  • 修改类的复杂性

正面案例

明确应用访问修饰符,所有字段默认为private,外部访问仅通过属性和公共方法。测试需求使用接口或同一程序集中的朋友类。

优点:

  • 保护内部数据
  • 可以轻松更新实现而不影响客户
  • 灵活的架构

缺点:

  • 有时需要额外代码(get/set)
  • 为测试组织friend/internal访问的必要性