子类的块基构造函数
本文关键字:构造函数 子类 | 更新日期: 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)
。