c#中私有成员的继承

时间:2013-10-18 09:37:48

标签: c# asp.net inheritance private

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

感谢

10 个答案:

答案 0 :(得分:5)

如果我正确理解您的问题,那么您并不关心辅助功能您只关心私有成员是否继承

答案是肯定的,所有私人成员都是继承的,但你无法反复访问它们。

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
}

答案 1 :(得分:2)

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

编辑:就他们是否继承而言,他们是这样做的。子类仍然是父类类型,因此继承了所有内容。孩子无法直接访问它,但如果你调用使用私有父字段的基类方法,那就可以了。

答案 2 :(得分:1)

就像斯里兰姆所说的那样,是的,私人成员确实得到了继承,但他们可以进入。

如果他们不会获得继承,受保护或公共属性引用私有成员将破坏继承的类。

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,因为它在基类中是私有的。但是,memeber是继承的,因此可以通过受保护的属性MyProp访问。

答案 3 :(得分:0)

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

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

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

谈论私人成员的价值观时:当然,他们是继承的。派生类也始终是基类的类型。如果基类拥有一个私有值来存储一些数据,派生类也会这样做 - 只是你不能从派生类中访问该值。

另请阅读Accessibility Levels in the MSDN上的相关文章。

答案 4 :(得分:0)

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

  

派生类可以访问public,protected,internal,   并保护基类的内部成员。即使是   派生类继承了基类的私有成员   无法访问这些成员。但是,所有这些私人成员都是   仍然存在于派生类中,可以完成相同的工作   在基类本身做。例如,假设受保护   基类方法访问私有字段。那个领域必须是   出现在派生类中以便继承基类   方法正常工作。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

你所说的关于私有领域的继承是完全正确的。

这里发生了什么:子类将继承您的基类的行为。这种行为可能需要一些领域才能奏效。因此,您的子类将为它们保留一些空间,但是您将无法仅使用方法(公共和受保护的方法)来操纵这些字段

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

在低级别,您的编译器会阻止您访问/更改这些私有字段,但即使使用反射,您仍然可以这样做。

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

答案 7 :(得分:0)

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

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

funfact: 实际上,仍然可以使用名为reflection的东西访问私有属性。但是不要担心,除非你真的需要知道发生了什么以及你在做什么,否则你不应该为此目的使用反射。

答案 8 :(得分:0)

为了扩展已经说过的内容,当内部范围在起作用时,子类可以访问私有。例如,以下内容将编译:

class A
{
    private int _private;

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

答案 9 :(得分:0)

最简单的答案是你不能直接在派生类中访问基类的私有变量但是当启动重写类对象时,这个私有对象和值在基类中初始化(因此继承了基类变量)并且你可以访问如果基类暴露它们,它们会使用某些属性或函数 为了使解释更清楚,

    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变量,如果基类公开函数或属性,那么我可以访问所有基类变量。