Abstract类的子类,始终调用Abstract constructor

时间:2015-05-12 01:54:31

标签: c# constructor abstract-class

我有一个抽象类和一个子类

abstract class abstractClass
{
    public int x;

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

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

我有很多像这样的子类,所有这些类总是通过在构造函数中调用abstractClass1(int x)来调用公共构造函数base(x)

当我想向构造函数添加新属性时,例如另一个int y,我必须编辑所有这些类,并在每个子构造函数中添加y作为参数加上摘要类构造函数。

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

3 个答案:

答案 0 :(得分:3)

这是一个想法:创建一个AbstractClassParameters类:

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

现在,您可以将AbstractClassParameters的实例传递给抽象类构造函数,并且每个子类都可以执行相同的操作,只需将其传递。

abstract class abstractClass
{
    public int x;

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

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

添加参数时,您只需编辑AbstractClassParameters类和abstractClass,而不是每个子类。

答案 1 :(得分:0)

不幸的是,我认为你不能以任何其他方式做到这一点。您必须修改抽象类,因为您必须添加新成员y。您可以修改抽象类构造函数来初始化成员y,也可以在y周围创建一个属性,让子项在构造函数中初始化它。

答案 2 :(得分:0)

在我看来,大多数现有的子类都可以轻松接受新属性 y 的默认值。在这种情况下,使用新属性初始值设定项为基类添加新的构造函数,并让旧构造函数将新属性的值设置为公共默认值。现在,只有需要新属性的非默认值的子类才需要调用扩展的基类构造函数。

你的例子变成了:

{{1}}