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

这是一个示例来说明我要说的内容:

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 YB(bool p)C(bool p)放在class A的构造函数中作为A(bool p),然后让B(bool p)C(bool p): 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(...)从子类中调用它。

09-11 19:46
查看更多