首页 > 解决方案 > 我可以在我的子类中重复使用我的超类的可选构造函数参数吗?

问题描述

我有一个带有构造函数的超类,它使用可选参数来避免编写多个重载的构造函数:

namespace Example
{
    abstract class Super
    {
        string mandatory;
        string optional;
        const string optionalDef = "default";

        public Super(string mandatory, string optional = optionalDef)
        {
            this.mandatory = mandatory;
            this.optional = optional;
        }
    }
}

构造函数可以用一个或两个参数调用,所以就像我在实现两个重载的构造函数一样。现在我正在尝试在子类中“重用”它:

namespace Example
{
    class Sub : Super
    {
        public Sub(string mandatory, string optional) : base(mandatory, optional) { }

        public Sub(string mandatory) : base(mandatory) { }
    }
}

由于我的默认值在超类中是“隐藏的”,我不知道如何从避免重载构造函数的超类中镜像我的结构。我想做这样的事情当然不存在:

public Sub(string mandatory, string optional = undefined) : base(mandatory, optional) { }

我尝试过的另一件事是:

public Sub(string mandatory, string optional = base.optionalDef) : base(mandatory, optional) { }

我认为如果我制作optionalDef静态(这似乎是一种黑客行为),这可能会起作用,但是一旦我Sub再次子类化,我认为它就不再起作用了(因为base.base不允许)。

谢谢!

标签: c#

解决方案


您可以简单地进行optionalDef保护:

abstract class Super
{
    string mandatory;
    string optional;
    protected const string optionalDef = "default";

    public Super(string mandatory, string optional = optionalDef)
    {
        this.mandatory = mandatory;
        this.optional = optional;
    }
}

abstract class Sub : Super
{
    public Sub(string mandatory, string optional = optionalDef) : base(mandatory, optional) { }
}

如果由于某种原因这不可能并且null不是可能的值,您也可以使用它。


推荐阅读