子类的块基构造函数

本文关键字:构造函数 子类 | 更新日期: 2023-09-27 18:12:30

我肯定这个问题在别的地方,但是找不到它。

我有一个抽象类,它将是其他类的基础。希望基类的基构造函数不可访问,并且子类不能编辑该行为,迫使它们使用另一个构造函数。

public abstract class BaseClass
{
    protected int X;
    private BaseClass() { } // Problematic accessor
    public BaseClass(int x)
    {
        X = x;
    }
}
public class Child : BaseClass
{
    public Child(int x)
    {
        X = x + 5;
    }
}

如果我将BaseClass()基构造函数设置为private,它不会编译,但如果我将它设置为protected, Child可以覆盖它。

有一种方法来阻止子修改基构造函数?

编辑:我希望基构造函数在类之外也不可访问

子类的块基构造函数

如果你不想在

  BaseClass()

构造函数,只需删除它(BaseClass有一个显式的构造函数,这就是为什么没有一个默认的构造函数):

  public abstract class BaseClass
  {
      //TODO: probably you want a property to read X
      private int X; // <- private looks better for fields
      public BaseClass(int x)
      {
          X = x;
      }
  }

对于Child类,你必须调用它的基构造函数,即base(int x):

public class Child : BaseClass
{
    public Child(int x)
      : base(x + 5) // since X is private, let's move logic into the call
    {
    }
}

您需要使用正确的基类构造函数来做您想做的事情:

public class Child : BaseClass
{
    public Child(int x) : base(x)
    {
        X = X + 5;
    }
}

注意Child构造函数体现在使用受保护的字段X,而不是参数x

完全省略无参数构造函数。现在,每个派生类都必须调用public BaseClass(int x)