Abstract class 的 Subclass,总是调用 Abstract 构造函数

Subclass of an Abstract class, always call Abstract constructor

我有一个摘要class和一个childclass

abstract class abstractClass
{
    public int x;

    protected abstractClass(int x)
    {
        this.x = x;
    }
}

class childClass : abstractClass
{
    childClass(int x)
        : base(x)
    {
    }
}

我有很多像这样的 child classes,其中所有这些 classes 总是通过调用 [=13= 来调用公共构造函数 abstractClass1(int x) ] 在他们的构造函数中。

当我想向构造函数添加一个新的 属性 时,例如另一个 int y,我必须编辑所有这些 classes 并添加 y 作为每个 child 的构造函数加上抽象 class 构造函数的参数。

考虑到我事先知道每个 child class 都将使用抽象 class 构造函数并且不会添加任何其他内容,是否有另一种方法可以做到这一点?

很遗憾,我认为您无法通过任何其他方式做到这一点。你必须修改 abstract class 因为你必须添加新成员 y。您可以修改抽象 class 构造函数来初始化成员 y 或者您可以围绕 y 创建一个 属性 并让 children 在构造函数中初始化它。

在我看来,大多数已经存在的子classes 可以很容易地接受新属性 y 的默认值。在这种情况下,使用新的 属性 初始值设定项为基础 class 添加一个新构造函数,并让旧构造函数将新 属性 的值设置为公共默认值。现在只有需要新 属性 的非默认值的子 classes 需要调用扩展的 base-class 构造函数。

您的示例变为:

abstract class abstractClass
{
    public int x { get; private set; }
    public int y { get; private set; }

    protected abstractClass(int x) : this(x, defaultY) {}
    protected abstractClass(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

class childClass : abstractClass
{
    childClass(int x)
        : base(x)
    {
    }
}

class childClass2 : abstractClass
{
    childClass(int x, int y)
        : base(x,y)
    {
    }
}

这是一个想法:制作一个 AbstractClassParameters class:

class AbstractClassParameters {
    public int x { get; private set; }
    // add more parameters here
    public AbstractClassParameters(int x) {
        this.x = x;
        // add more initializers here
    }
}

现在您可以将 AbstractClassParameters 的实例传递给抽象 class 构造函数,每个子 class 都可以做同样的事情,只需传递它即可。

abstract class abstractClass
{
    public int x;

    protected abstractClass(AbstractClassParameters p)
    {
        this.x = p.x;            
    }
}

class childClass : abstractClass
{
    childClass(AbstractClassParameters p) : base(p) { }
}

添加参数时,只需编辑AbstractClassParametersclass和abstractClass,而不是每个子class。