如果派生类继承基类的私有成员,那么为什么不建设者?(If derived class inherit

2019-07-20 11:57发布

我想清楚我在C#中这个基本OOPS概念的理解。 在大多数互联网网站的,我读了一个派生类继承基类的私有成员,但不能访问这些成员。

派生类可以访问公共,保护,内部,和受保护的基类的内部部件。 即使一个派生类继承基类的私有成员,它不能访问这些成员。 然而,所有这些私有成员仍然存在于派生类,可以做他们会在基类本身做同样的工作。 例如,假设一个受保护的基类的方法访问私有字段。 该字段必须存在在派生类为了继承基类的方法,以正常工作。

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

我的问题是,如果我们考虑以上是正确的,那么我们可以说“基类的构造函数在派生类中继承,但是派生类只能访问/使用base关键字调用它通过自身的构造函数,这个构造函数将无法使用外面的世界而创造派生类的实例”。

public class Employee
{
    public int salary;

    public Employee(int annualSalary)
    {
        salary = annualSalary;
    }
}

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

因为调用基类的构造函数,它应该存在这个类里面 。 也许我的解释是错误的。 任何人都可以请解释一下吗?

提前致谢!

Answer 1:

这取决于你如何定义“礼物”。 如果你将它定义为“可用的地方”,在基类的私有成员是“存在”,以及构造函数。 如果定义了“存在”是“在特定的类中”,既没有“存在”。

尝试使用反射。 你不会找到从基类的任何私有成员。 私有成员继承,从而可用,但目前仍只在基类。

那么,构造函数。

    class A
    {
        private A(int i) { }
        public A() { }
        private void Foo() { }
        public void Bar() { }
    }

    class B : A
    {

    }

    var aProperties = typeof(A).GetMembers(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy);
    // you won't see Foo in this line, nor any constructors of A
    var bProperties = typeof(B).GetMembers(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public  | BindingFlags.FlattenHierarchy);

最后,你可以说:

  • 基类的所有成员都存在于某种方式方面可供执行。
  • 有没有语法继承类调用私有成员(也没有从任何地方ELS的类外)
  • 基类的构造函数只能从使用构造称为base关键字。 (A构造总是从层次结构中的每一基类调用。如果未指定,则默认的构造。)
  • 只有由一个类中声明(或重写)成员实际上是找到了“内部”特定类。 使用反射,你可以使用BindingFlags.FlattenHierarchy从基类拼合可见的成员。 私有成员和构造函数的声明类只找到。


Answer 2:

为了构建一个Manager ,你需要构建使用任何构造函数在基类的基类,如果是只有一种(在这种情况下),你需要调用它。 这并不意味着你必须定义具有相同签名的构造函数。

你也将被允许这样做:

public Manager() : base(100000)
{
}

要么

public Manager(string name, int salary) : base (salary)
{
     // store name
}

在施工过程中,你的Manager ,你会在堆上分配一个新的对象。 该对象将权利要求足够的内存,以便它可以存储在基础类(定义的变量Employee )和混凝土类( Manager )。



Answer 3:

“基类构造函数的继承在派生类中,但是派生类只能访问/使用base关键字调用它通过自身的构造函数,并同时创造派生类的实例此构造将不会提供给外面的世界”。

是的,这是正确的。

因为调用基类的构造函数,它应该存在这个类里面。

就像基地的私人或受保护的成员,它的“存在”,但不能入店到外面。



Answer 4:

如果存在着一些一类人可以指定每一个父类的构造函数,系统应推断儿童类的构造函数的存在具有相同签名和访问它什么也不做,但过程字段初始化和链条的手段将是有益的到相应的基构造。 有可用的具体要求这样的功能会不会对身体造成的错误; 甚至有是这样的推论,当一个派生类没有指定任何构造函数(而不只是推断参数的构造函数是链基本参数的构造函数)很可能是相当安全的,如果这是一个语言的设计特征(加入这样的功能以现有的框架,但是,这是一个坏主意,因为它要揭露一个无参数的构造函数派生类的作者,但是没有任何参数的人可能没有包括任何构造,并期望编译器将只能推断参数的构造函数)。

如果一个派生类有它自己的任何不平凡的构造,但是,它是可能的子类并不打算对于没有通过其中的一个将要创建的任何对象。 假设一个父类只有一个参数的构造函数,有人写道:

class Child : Parent
{
   Thing blah;
   Child()
   {
      blah = new Thing();
   }
}

每个Child是创建将不得不blah设置为一个新的东西。 现在,假设基类的一个新版本增加了一个Name属性,并增加了一个构造函数指定的名称。 如果是继承了自动构造函数,那么代码表示myChild = new Child("Fred"); 将通过向构造函数链Parent ,但从来没有设置blah到一个新的Thing

安全构造“继承”可能提出的可能的,如果一个类可以指定每个实例应该通过链接到一个父类的构造,然后执行的代码指定块,建立子类不变量来产生。 这样的特征会有些复杂但是实现,并且现在还不清楚,这将是值得的成本。



文章来源: If derived class inherits the private members of a base class, then why not constructors?