任何人都可以解释以下C#代码的有效性和无效性的原因:
class A
{
protected void ProtectedFunction()
{
A a = new A();
a.ProtectedFunction(); //Valid (Point 2)
}
}
class B : A
{
public void Function_B()
{
A a = new A();
base.ProtectedFunction();//Valid (Point 1)
a.ProtectedFunction(); //Invalid, why??? (Point 1)
B b = new B();
b.ProtectedFunction(); //Valid, called by instance b (Point 2)
ProtectedFunction(); //Valid, called by base instance
}
}
class C : B
{
public void Function_C()
{
A a = new A();
a.ProtectedFunction(); //Invalid, why??? (Point 1)
B b = new B();
b.ProtectedFunction(); //Invalid, why??? (Point 2)
C c = new C();
c.ProtectedFunction(); //Valid, called by instance c (Point 2)
ProtectedFunction(); //Valid, called by base instance
}
}
看起来它自己的类/上下文中的实例可以访问受保护的方法,但是类/上下文中的相同实例无法访问该方法。
问题是当通过实例访问时,正在执行的代码不在实例自己的上下文中,而是在另一个实例的上下文中(尽管是同一个类)。
答案 0 :(得分:0)
所有Point 1都无效,因为可以从定义它们的类调用受保护的方法;或继承的子类;无法在实例上调用受保护的方法。
但是有一个例外,只要在类定义中使用类的实例,就可以访问受保护的方法;所以Point 2s有效。
答案 1 :(得分:0)
私人=只有这个班级可以使用。
受保护=只有这个类和派生类可以使用。
使用for i in `ls -a`; do du -sh $i ; done | sort -h
您正在创建a的实例并作为局外人访问,因此此方法不可用。
如果您想通过实例访问成员,它应该是公共的(如果您只想从程序集中访问,则应该是内部的)
答案 2 :(得分:0)
这些电话
A a = new A();
a.ProtectedFunction(); //Invalid, why??? (Point 1)
都无效,因为无法从类的实例外部访问ProtectedFunction()。因此,即使您从继承的类中调用它,也可以调用差异实例(或对象,如果您愿意),这样您就无法再访问它了。
真实世界的例子可能是电子邮件。我可以阅读自己的私人电子邮件,但你无法阅读我的。如果我有孩子,他们会继承我阅读他们自己的私人电子邮件的能力 - 但他们仍然无法阅读我的!