根据这个post,下面的代码应该编译,而不是。
class Base
protected m_x as integer
end class
class Derived1
inherits Base
public sub Foo(other as Base)
other.m_x = 2
end sub
end class
class Derived2
inherits Base
end class
它可能有什么问题?我刚刚创建了一个新的VB.NET控制台项目并复制粘贴代码。
我得到的错误信息是:'SampleProject.Base.m_x'在此上下文中无法访问,因为它是“受保护的”,并且我检查了不同的.NET框架版本(2.0,3.0和3.5)。
答案 0 :(得分:3)
只能通过MyBase.m_x
(基于C#)从派生类访问受保护的成员。
你可以写:
public sub Foo(other as Base)
MyBase.m_x = 2
end sub
other.m_x = 2
无法编译的原因是,因为other
不是(或不一定是)Derived1当前实例的基类实例。它可以是Base的任何实例,因为它是参数值。
答案 1 :(得分:2)
您可以访问继承的变量,而不是基类的实例中的变量。
class Base
protected m_x as integer
end class
class Derived1
inherits Base
public sub Foo(other as Base)
MyBase.m_x = 2 ' OK - Access inherited member
other.m_x = 2 ' NOT OK - attempt to access a protected field from another instance
end sub
end class
答案 2 :(得分:0)
受保护成员的一个关键方面是一个类可以有效地封锁继承的受保护成员,使其不被其祖先以外的任何类访问(如果一个类既可以覆盖父类的方法/属性又可以阻止子类,那将会很好从访问它,但据我所知,没有添加额外的层次结构,没有办法做到这一点)。例如,一个碰巧支持克隆的类,但对于那些不具备的类,可能是一个有用的基类,可能有一个受保护的“克隆”方法。不支持克隆的子类可以通过创建一个名为“Clone”的虚拟嵌套类来阻止它们自己的子类调用Clone,这将隐藏父Clone方法。
如果对象可以访问继承链中其他位置的受保护成员,则“受保护”的这一方面将不再适用。