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

4
假设我在我的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和第一个构造函数。
有没有方法可以实现这一点,还是在这种情况下我只需要重新编写每个构造函数中的代码?
谢谢!!

1
DerivedClass中,您的(string somethingNew)构造函数调用了base() - 在您提出的示例中,您是否希望显式的base(someVal)覆盖this(somethingNew)中的base()调用? - NWard
@NWard,好问题 - 在我的(非常特殊的)情况下,这不会有任何影响,因为这两种方法并不矛盾,但我可以看出这可能会引起问题。在我的情况下,我基本上希望它调用base(someVal),然后再调用this(somethingNew)构造函数中的代码。 - John Bustos
3个回答

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
这正是我会回答的。在命名方面,我经常看到使用“Init”,如果初始化需要更多操作而不仅仅是设置值,那么这可能是一个好选择。 - user743382

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);


1
我会设计基类如下所示:

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

为了保证代码 ... 总是被执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接