繁体   English   中英

是否可以从基类构造函数中调用派生类构造函数?

[英]Is it possible to call a derived class constructor from a base class constructor?

我有一个抽象的基类,我从中派生出两个类。 抽象类有一个受保护的字段,由派生类中的构造函数初始化。 每个派生类都有两个构造函数,每个类的第一个构造函数初始化字段,第二个构造函数通过调用第一个构造函数来修改第一个构造函数的初始化。 两个派生类的第二个构造函数完全相同,但第一个构造函数在两个派生类之间是不同的。 有没有办法将第二个构造函数放在基类中?

这是一个例子来说明我想说的:

public abstract class A {
    protected int[] field1;

    public void someMethod() {
        //somethingsomething
    }
}

public class B : A {
    public B() {
        //body X
        //this initializes field1 in some way
    }

    public B(bool p) : this() {
        //body Y
        //this initializes field1 in some way + modification
    }
}

public class C : A {
    public C() {
        //body Z
        //this initializes field1 in another way
    }

    public C(bool p) : this() {
        //body Y
        //this initializes field1 in another way + modification
    }
}

我想做的是找到一些方法,以便不必重复body Y两次。 我想把B(bool p)C(bool p) body Y放在A(bool p) class A的构造函数中作为A(bool p) ,然后有B(bool p)C(bool p)调用基类构造函数with : base(bool p)后跟一个空体,但后来意识到基类构造函数必须调用派生类构造函数。

这对我来说听起来也很愚蠢。 虽然我不确定,但是因为我有这种感觉,从基类调用派生类中的某些内容只能在运行时完成,而且在编译时确实没有办法检查它。 我只是想找到一种方法来遵循DRY原则。

谢谢。

简答:不。 这将打破面向对象的范式,所以你不希望能够做到这一点。 以这种方式思考:抽象基类可以通过任意数量的类进行扩展,但如果它与其中一个子类紧密耦合,那么它会如何影响其他类?

public class BaseClass {
     // Call child class constructor
     public BaseClass() : A() { }
 }

 public class A : BaseClass {
      public A() { ... }
 }

 // How should BaseClass handle this? There is no constructor named "A."
 public class B : BaseClass {
        public B() { ... }
 }

如果希望基类和派生类共享某些功能,则应将其作为基类中的受保护方法。 这样,您可以从构造函数中调用该方法。

您还可以在基类上创建一个提供公共功能的构造函数,并使用: base(...)从子类调用它。

基类可以触发派生行为的唯一方法是通过多态(在B中使用虚拟方法,并覆盖它)。

但是在你的情况下,还有一些其他可能更直观的方式。 例如:

public class C : A {
    public C() {
        //body Z
        //this initializes field1 in another way
    }

    public C(bool p) : base(p) {
        //this initializes field1 in another way + modification
    }
}

请注意,在您的示例中,B的默认构造函数调用A的默认构造函数,而C的默认构造函数调用B的默认构造函数。

最后,您还可以考虑在A中使用第二个构造函数接收field1初始值作为参数,但这取决于您的指令是否依赖于顺序。

如果你准确地确定了你的构造者所做的事情,那么我可能会为你做出更具决定性的答案。

此致

暂无
暂无

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

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