在Visual Basic中,"受保护"(Protected)访问级别用于封装——它允许类的成员仅在类本身及其派生类中可访问。这对于组织面向对象的架构以及限制对对象内部实现的直接访问非常重要。
历史上,在经典的VB6中几乎没有这样的灵活性,而从VB.NET开始,添加了与现代面向对象标准相对应的完整访问修饰符。
访问管理错误可能导致类的属性或方法被错误使用,并可能导致封装的破坏。例如,公开方法(Public)对所有人可见,包括外部组件,而受保护的方法限制了派生类的访问。
在VB.NET中可以使用Protected、Protected Friend和Private修饰符。Protected只在类及其子类中可见,Protected Friend在程序集(assembly)和子类中可见,Private仅在声明类的范围内可见。
代码示例:
Public Class Animal Protected Sub Eat() Console.WriteLine("Eating...") End Sub Private Sub Sleep() Console.WriteLine("Sleeping...") End Sub End Class Public Class Dog Inherits Animal Public Sub PerformEat() Eat() ' 可访问:Protected End Sub ' Sleep()不可访问:Private End Class
关键特性:
Protected修饰符能否为程序集中的所有类提供类成员的可见性?
不能,只有类及其派生类可见。Protected Friend适用于类、其派生类以及程序集中的所有类。
是否可以明确地指示某个属性仅对于程序集外的子类可见,而在程序集内不可见?
不可以,没有这样的级别。Protected Friend同时分配可见性给派生类和程序集,但不能单独区分这些区域。
如果基类中的方法被定义为Protected,是否可以在子类中将其重写为Public?
不可以,访问级别只能保持或严格向下扩展,不能收缩;扩展访问级别会违反封装原则。在.NET中,编译器会在尝试收缩访问级别时抛出错误。
初学者将内部业务逻辑方法声明为Public。在更新程序一段时间后,由于外部组件对这些方法的无控制访问,出现了大量错误。
优点:
缺点:
经验丰富的程序员使用Protected和Private,分隔父类和子类之间的责任区域。这使得更新不会影响外部API,减少了错误的数量。
优点:
缺点: