0

我有一组从基类继承的类......

public abstract class BaseClass
{
    public BaseClass()
    {
        // ...
    }
}

public abstract class BaseMessageClass : BaseClass
{
    // ...
}

public SpecificMessageClass : BaseMessageClass
{
   // ...
}

像这样实例化一个对象是有效的:

SpecificMessageClass myMessage = new SpecificMessageClass();

但是,我需要将所有构造函数更改为具有可选字符串参数,如下所示:

public abstract class BaseClass
{
    public BaseClass(string optParam="whatever")
    {
        // ...
    }
}

现在,当我尝试使用可选参数实例化对象时:

SpecificMessageClass myMessage = new SpecificMessageClass("coolstring");

我得到错误:

'SpecificMessageClass' 不包含带有 1 个参数的构造函数”

有没有任何方法可以在不显式声明每个继承类级别的构造函数的情况下做到这一点?

4

2 回答 2

1

不。

但是鉴于您想要继承,我猜您希望相同的逻辑适用于某些继承的字段或属性的所有级别。如果是这样,您可以获得的最接近的方法是在基类上添加像 Create<T>(string optParam="whatever") 这样的工厂方法,如下所示:

public class BaseClass
{
    public static T Create<T>(string optParam="whatever") where T : BaseClass
    {
        var t = new T(); //which invokes the paramterless constructor
        ((BaseClass)t).SomePropertyOrFieldInheritedFromTheBaseClass = optParam; //and then modifies the object however your BaseClass constructor was going to.
        return t;
    }
}

这将允许该类的所有实现者实现 BaseClass 并获得与具有可选参数构造函数相同的效果。

顺便说一句,我没有测试上面的代码,所以你可能需要稍微调整一下。但希望它给出了这个想法。

我认为这可能是你能得到的最接近的。

于 2016-04-15T00:45:58.800 回答
0

构造函数是特殊的方法。如果你的类没有指定构造函数,它将有一个继承自父类的无参数构造函数的无参数构造函数。只要您指定了一个构造函数,您就不会自动免费获得任何父构造函数。您必须声明所需的每个不同的构造函数。

于 2016-04-15T02:11:54.557 回答