4

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

谢谢

4

10 回答 10

10

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

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

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
}
于 2013-10-18T09:44:41.487 回答
2

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

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

于 2013-10-18T09:40:00.940 回答
1

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

于 2013-10-18T09:44:52.183 回答
1

就像 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 访问它。

于 2013-10-18T09:52:39.987 回答
0

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

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

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

在谈论私有成员的值时:当然它们是继承的。派生类也总是属于基类的类型。如果基类拥有一个私有值来存储一些数据,那么派生类也会这样做——只是你不能从派生类访问该值。

另请阅读MSDN 中有关 Accessibility Levels的相关文章。

于 2013-10-18T09:39:47.160 回答
0

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

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

于 2013-10-18T09:41:35.810 回答
0

你所说的私有字段被继承是完全正确的。

这里会发生什么:子类将继承您的基类的行为。这种行为可能需要一些字段才能起作用。因此,您的子类将为它们保留一些空间,但您将无法操作这些字段,只能使用方法(公共和受保护的)

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

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

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

于 2013-10-18T09:50:45.697 回答
0

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

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

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

于 2013-10-18T09:53:59.550 回答
0

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

class A
{
    private int _private;

    class B : A
    {
        void Foo()
        {
            this._private = 2;
        }
    }
}
于 2013-10-18T09:57:05.490 回答
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 变量,如果基类公开函数或属性,则我可以访问所有基类变量。

于 2013-10-18T10:03:06.170 回答