代码之家  ›  专栏  ›  技术社区  ›  Roman

C#通过基类变量[duplicate]访问的受保护成员

  •  11
  • Roman  · 技术社区  · 16 年前

    这似乎是一个很新的问题,但您能解释一下为什么方法Der.B()不能通过基类变量访问受保护的Foo吗?我觉得这很奇怪:

    public class Base
    {
        protected int Foo;
    }
    
    public class Der : Base
    {
        private void B(Base b) { Foo = b.Foo; } // Error: Cannot access protected member
    
        private void D(Der d) { Foo = d.Foo; } // OK
    }
    

    谢谢

    5 回复  |  直到 16 年前
        1
  •  22
  •   Eric Lippert    16 年前

    这是一个常见问题。想知道为什么这是非法的,想想会出什么问题。

    假设您从Base派生了另一个派生类Frob。现在您将Frob的一个实例传递给Der.B。您是否可以从Der.B访问Frob.Foo?不,绝对不是。Frob.Foo受到保护;只能从Frob和Frob的子类访问它。Der不是Frob,也不是Frob的子类,因此它不能访问Frob的受保护成员。

    如果不清楚,请参阅我的文章:

    http://blogs.msdn.com/ericlippert/archive/2005/11/09/491031.aspx

        2
  •  4
  •   Yuriy Faktorovich    16 年前

    在B中,您试图访问另一个类的受保护成员。您从该类继承的事实与此无关。在D中,您正在访问当前类的基类的受保护成员。在此上下文中,您可以从Der及其继承类型的受保护成员访问任何内容。

        3
  •  3
  •   Tara McGrew    16 年前

    您可以通过在基类中声明静态方法来克服此限制:

    public class Base
    {
        protected int Foo;
    
        protected static int GetFoo(Base b)
        {
            return b.Foo;
        }
    }
    
    public class Der : Base
    {
        private void B(Base b) { Foo = GetFoo(b); } // OK
    }
        4
  •  2
  •   Ragepotato    16 年前

    简单地说,protected允许访问子类。

    在:

    private void B(Base b) { Foo = b.Foo; }
    

    您正试图访问您的Der实例无权访问的受保护成员。只有当它是当前Der实例(this)的基类时,它才能访问它。

    private void D(Der d) { Foo = d.Foo; } // OK
    

    工作正常,因为您要通过Der访问它的基类保护方法。

        5
  •  0
  •   Ben Lesh    16 年前

    在您尝试的场景中,您将希望对int-Foo使用“internal”。