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

时间:2016-10-21 15:05:55

标签: c# inheritance 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两次。我正考虑将body Y B(bool p)C(bool p)放在class AA(bool p)的构造函数中,然后B(bool p)C(bool p): base(bool p)调用基类构造函数后跟一个空体,但后来意识到基类构造函数必须调用派生类构造函数。

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

感谢。

2 个答案:

答案 0 :(得分:3)

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

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(...)从子类中调用它。

答案 1 :(得分:0)

基类触发派生行为的唯一方法是通过多态(在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初始值作为参数,但这取决于您的指令是否依赖于顺序。

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

此致