C# - 在派生类中调用基类和类构造函数

时间:2016-03-21 16:34:23

标签: c# inheritance constructor

假设我的C#程序中有以下基类和派生类:

class BaseClass
{
    public BaseClass() { }
    public BaseClass(int someVal) 
    { 
        // do something here 
    }
}

class DerivedClass : BaseClass
{
    public DerivedClass(string somethingNew) 
        : base()
    {
        // do something with the somethingNew varible
    }
    public DerivedClass(string somethingNew, int someVal)
        : base(someVal)
    {
        // do **THE SAME THING** with the somethingNew varible as in first constructor
    }
}

我的问题出现在最终的构造函数中 - 理想情况下,我想要的是能够做一些事情(尽管这不会编译):

    public DerivedClass(string somethingNew, int someVal)
        : base(someVal)
        : this(somethingNew)
    {

    }

换句话说,同时调用base和第一个构造函数。

有没有办法做到这一点,或者我只是需要在这种情况下重新编写每个构造函数中的代码?

谢谢!

3 个答案:

答案 0 :(得分:2)

不是说这是正确的答案(而且我很想听别人怎么建议我这样做),但我最终做的是创建一个私有的setter方法,构造函数可以按以下方式调用:

class DerivedClass : BaseClass
{
    public DerivedClass(string somethingNew) 
        : base()
    {
        setVals(somethingNew);
    }
    public DerivedClass(string somethingNew, int someVal)
        : base(someVal)
    {
        setVals(somethingNew);
    }

    private setVals(string somethingNew) 
    {
        // do something with the somethingNew varible
    }
}

它保存了我必须处理重复代码的问题,似乎是最干净的方法,但是,正如我所说的,我很乐意看到其他人推荐/如果有更好的方法可以做到这一点。

感谢!!!

答案 1 :(得分:1)

您可以使用构造函数中的默认可为空参数值来完成此操作。

class BaseClass
{
    public BaseClass(int? someVal = null) 
    { 
        if (someVal.HasValue) 
        {
            //Do something here
        }
    }
}

class DerivedClass : BaseClass
{
    public DerivedClass(string somethingNew, int? someVal = null) 
        : base(someVal) // Pass someVal into BaseClass
    {
         // Do something with SomethingNew
    }
}

然后可以将其称为:

var d = new DerivedClass("SomeValue");

var d2 = new DerivedClass("SomeOtherValue", 2);

答案 2 :(得分:1)

我会像这样设计基类

class BaseClass
{
    public BaseClass() { ... }
    public BaseClass(int someVal) : this() { }
}

确保始终执行...代码。