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

C# 是否可以从基类构造函数调用派生类构造函数?,c#,inheritance,constructor,C#,Inheritance,Constructor,我有一个抽象基类,从中派生出两个类。抽象类有一个受保护的字段,该字段由派生类中的构造函数初始化。每个派生类都有两个构造函数,每个类的第一个构造函数初始化字段,第二个构造函数通过调用第一个构造函数修改第一个构造函数的初始化。两个派生类的第二个构造函数完全相同,但两个派生类之间的第一个构造函数不同。有没有办法将第二个构造函数放入基类中 下面是一个例子来说明我想说的: public abstract class A { protected int[] field1; public v

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

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

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
    }
}
我想做的是找到一些方法,这样就不必重复
正文Y
两次。我想把
B(bool p)
主体Y
C(bool p)
放在
类a
的构造函数中,作为
a(bool p)
,然后让
B(bool p)
C(bool p)
调用基类构造函数,其中
:base(bool p)
后跟一个空主体,但后来意识到基类构造函数必须调用派生类构造函数

这对我来说也很愚蠢。虽然我不确定,但这是因为我觉得从基类调用派生类只能在运行时完成,在编译时根本无法检查。我只是想找到一个遵循干燥原理的方法


谢谢。

简短回答:不。这将打破面向对象的模式,所以无论如何你都不想这样做。这样想:一个抽象基类可以被任意数量的类扩展,但是如果它与其中一个子类紧密耦合,那会对其他子类产生什么影响呢

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的默认构造函数

最后,您也可以考虑在接收Field1初始值作为参数的第二个构造函数中,但这取决于您的指令是否依赖于顺序。 如果你能精确地说明你的构造器到底做了什么,我可能会给你一个更明确的答案


诚恳地说,

不,您不能调用子构造函数,但您可以在
a
上创建
Y
方法,并从两个构造函数调用它。好的,这很有意义。谢谢@DStanley。