任何人都可以解释以下代码的有效性和无效性的原因

时间:2016-01-15 13:11:21

标签: c# oop

任何人都可以解释以下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
    }
}

看起来它自己的类/上下文中的实例可以访问受保护的方法,但是类/上下文中的相同实例无法访问该方法。

问题是当通过实例访问时,正在执行的代码不在实例自己的上下文中,而是在另一个实例的上下文中(尽管是同一个类)。

3 个答案:

答案 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()。因此,即使您从继承的类中调用它,也可以调用差异实例(或对象,如果您愿意),这样您就无法再访问它了。

真实世界的例子可能是电子邮件。我可以阅读自己的私人电子邮件,但你无法阅读我的。如果我有孩子,他们会继承我阅读他们自己的私人电子邮件的能力 - 但他们仍然无法阅读我的!