繁体   English   中英

C#中私有成员的继承

[英]inheritance of private members in c#

在C#中继承类时,私有成员是否被继承? 我已经读过一些与此相关的主题,有人告诉私有成员是继承的,但不能访问私有成员,有人告诉了继承类时,它不是继承的。 请解释一下这个概念。 如果是继承的,任何机构都可以解释一下吗?

谢谢

如果我正确理解了您的问题,那么您就不必担心可访问性,而您只关心私有成员是否被继承

答案是肯定的,所有私有成员都是继承的,但是您不能在没有反射的情况下访问它们。

public class Base
{
    private int value = 5;

    public int GetValue()
    {
        return value;
    }
}

public class Inherited : Base
{
    public void PrintValue()
    {
        Console.WriteLine(GetValue());
    }
}

static void Main()
{
    new Inherited().PrintValue();//prints 5
}

您可以将事物标记为protected ,在这种情况下,您可以从派生类型访问它们。

编辑:就他们是否继承而言,是的。 子类仍然是父类类型,因此继承了所有内容。 子级不能直接访问它,但是如果您调用使用私有父级字段的基类方法,则可以正常工作。

就像Sriram所说,是的,私人成员确实可以继承,但无法访问。

如果它们不被继承,受保护或公共属性引用,私有成员将中断继承的类。

class myBase
{
  private string _myProp;
  protected string MyProp
  { 
    get 
    {
      return _myProp;
    }
    set
    {
      _myProp = value;
    }
  }
}
class myChild : myBase
{
  public myChild()
  {
    _myProp = "SomeString"; // This will fail!!!
    this.Myprop = "SomeString"; // This works
  }
}

在子类中,您不能直接访问_myProp,因为它在基类中是私有的。 但是,成员是继承的,因此可以通过受保护的属性MyProp对其进行访问。

标记为private成员只能在其定义的类型上访问。 您不能从派生类型访问它们。

可以在定义它们的类型和派生类型上访问标记为protected成员。

标记为internal成员只能从定义了类型的程序集中访问。 您可以结合使用protectedinternal访问修饰符。

在谈论私有成员的价值时:当然,它们是继承的。 派生类也始终是基类的类型。 如果基类拥有用于存储某些数据的私有值,则派生类也将这样做-只是您无法从派生类访问该值。

还请阅读MSDN中有关可访问性级别的相关文章。

http://msdn.microsoft.com/en-us/library/ms173149.aspx

派生类可以访问基类的公共,受保护的,内部的和受保护的内部成员。 即使派生类继承了基类的私有成员,也无法访问这些成员。 但是,所有这些私有成员仍然存在于派生类中,并且可以执行与基类本身相同的工作。 例如,假设受保护的基类方法访问私有字段。 为了使继承的基类方法正常工作,该字段必须存在于派生类中。

私有成员不能被继承,只能被保护,就像扩展的私有成员一样。

您所说的关于私有字段被继承的说法是完全正确的。

发生了什么:子类将继承基类的行为。 该行为可能需要一些字段才能起作用。 因此,您的子类将为其保留一些空间,但是您将无法仅通过使用方法(公共方法和受保护方法)来操纵这些字段。

换句话说,您的子类通过将它们保存在内存中来继承基类字段,但无法访问它们。

从低层次上讲,是编译器阻止您访问/更改那些私有字段,但是即使使用反射,您仍然可以这样做。

如果您需要任何澄清,请告诉我

简短的回答:是的,但是您无法直接访问它们。

当类A从类B派生而B具有私有属性时,该属性将存在于类A派生的实例中。但是,您无法访问它。 它必须存在,因为B类中指定的行为取决于它。

funfact:实际上,仍然可以使用称为反射的东西来访问私有财产。 但是不必为此担心,除非真正需要了解发生的事情和正在做的事情,否则不应为此使用反射。

为了扩展所说的内容,可以在内部作用域起作用时由子类访问私有。 例如,将编译以下内容:

class A
{
    private int _private;

    class B : A
    {
        void Foo()
        {
            this._private = 2;
        }
    }
}

最简单的答案是您不能直接在派生类中访问基类的私有变量,但是是的,当覆盖类对象启动时,此私有对象和值在基类中初始化(因此继承了基类变量),您可以使用一些方法来访问它们属性或函数(如果基类公开了它们)。
为了使说明更清楚,

    class A 
    {
        private int i;
        private int j;
        protected int k;

        public A()
        {
            i = j = k = 5;
        }
    }


    class B : A
    {
        private int i; //The same variable exist in base class but since it is private I can declare it
        private int j;
        private int k; //Here I get warning, B.k hides inherited member A.k'. Use the new keyword if hiding was intended.   F:\Deepak\deepak\Learning\ClientUdpSocketCommunication\ClientUdpSocketCommunication\Program.cs  210 25  ClientUdpSocketCommunication

        private int l;
        private int m;
        private int n;

        public B()
        {
            i= j = this.k = l = m = n = 7; // Here I have used this.k to tell compiler that I want to initialize value of k variable of B.k class
            base.k = 5; //I am assigning and accessing base class variable as it is protected

        }
    }

如果初始化了B类的对象,则将使用Bi,Bj,Bk,Bl变量初始化Ai,Aj,Ak变量,并且如果基类公开了函数或属性,那么我可以访问所有基类变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM