在C#4中,如何在具有重载构造函数的父类的子类中包含具有可选参数的构造函数?

在C#4中,如何在具有重载构造函数的父类的子类中包含具有可选参数的构造函数?,c#,inheritance,constructor,subclass,constructor-chaining,C#,Inheritance,Constructor,Subclass,Constructor Chaining,我有一个具有重载构造函数的父类,还有一个具有可选参数构造函数的子类。有没有办法让子类的构造函数在保留自己的可选参数的同时仍然公开父类的重载特性 下面是两个类及其所需构造函数的一些示例代码: class Foo { Foo(String arg0) { // do some stuff with arg0 } Foo(String arg0, List<x> arg1) : this(arg0) { /

我有一个具有重载构造函数的父类,还有一个具有可选参数构造函数的子类。有没有办法让子类的构造函数在保留自己的可选参数的同时仍然公开父类的重载特性

下面是两个类及其所需构造函数的一些示例代码:

class Foo {
    Foo(String arg0) 
    {
      // do some stuff with arg0
    }

    Foo(String arg0, List<x> arg1)
        : this(arg0)
    {
      // do some other stuff with arg1 that is special because we have an arg1
    }
}

class Bar : Foo {
    Bar(String arg0, List<y> arg2 = null, String arg3 = "") 
        : base(arg0)
    {
      // some third thing with arg2 and arg3
    }
}
class-Foo{
Foo(字符串arg0)
{
//用arg0做一些事情
}
Foo(字符串arg0,列表arg1)
:此(arg0)
{
//用arg1做一些其他特别的事情,因为我们有一个arg1
}
}
酒吧类别:富{
条形图(字符串arg0,列表arg2=null,字符串arg3=”“)
:base(arg0)
{
//关于arg2和arg3的第三件事
}
}
这是另一个子类构造函数的方法签名,我还想公开父构造函数的重载,但问题是如何做到这一点:

Bar(String arg0, List<x> arg1, List<y> arg2 = null, String arg3 = "")
Bar(字符串arg0,列表arg1,列表arg2=null,字符串arg3=”“)

我想,我已经找到了一个解决办法,但我不确定它是否尽可能干净。我已将其作为答案发布,以防它是唯一的选项。

以下是我提出的解决方案:

class Foo {
    Foo(String arg0) 
    {
      // do some stuff with arg0
    }

    Foo(String arg0, List<x> arg1)
        : this(arg0)
    {
      // do some other stuff with arg1
    }
}

class Bar : Foo {
    Bar(String arg0, List<y> arg2 = null, String arg3 = "") 
        : base(arg0)
    {
        this.Initialize( arg2, arg3);
    }

    Bar(String arg0, List<x> arg1, List<y> arg2 = null, String arg3 = "")
        : base(arg0, arg1)
    {
      this.Initialize( arg2, arg3);
    }

    private void Initialize(List<y> arg2, String arg3)
    {
      // some third thing with arg2 and arg3
    }
}
class-Foo{
Foo(字符串arg0)
{
//用arg0做一些事情
}
Foo(字符串arg0,列表arg1)
:此(arg0)
{
//使用arg1执行其他操作
}
}
酒吧类别:富{
条形图(字符串arg0,列表arg2=null,字符串arg3=”“)
:base(arg0)
{
初始化(arg2,arg3);
}
条形图(字符串arg0,列表arg1,列表arg2=null,字符串arg3=”“)
:基本(arg0、arg1)
{
初始化(arg2,arg3);
}
私有void初始化(列表arg2,字符串arg3)
{
//关于arg2和arg3的第三件事
}
}

这似乎有点不干净,因为我没有将子类的构造函数链接在一起,而是调用一个函数,但我想不出任何其他方法来做到这一点。

如果您可以将
Foo
更改为只有一个带有可选参数的构造函数,则可以执行以下操作:

public class Foo
{
    public Foo(String arg0, List<x> arg1 = null)
    {
        // do some stuff with arg0
        if (arg1 != null)
        {
            // do some other stuff with arg1
        }
    }
}

public class Bar : Foo
{
    public Bar(String arg0, List<x> arg1 = null, List<y> arg2 = null, String arg3 = "")
        : base(arg0, arg1)
    {
        // some third thing with arg2 and arg3
    }
}
公共类Foo
{
public Foo(字符串arg0,列表arg1=null)
{
//用arg0做一些事情
如果(arg1!=null)
{
//使用arg1执行其他操作
}
}
}
公共类酒吧:富
{
公共栏(字符串arg0,列表arg1=null,列表arg2=null,字符串arg3=”“)
:基本(arg0、arg1)
{
//关于arg2和arg3的第三件事
}
}

能否将
Foo
的签名更改为只有一个构造函数
Foo(字符串arg0,列表arg1=null)
?或者你需要区分传递null和根本不传递值吗?@Davy8-我需要区分传递null和不传递任何参数。我将更新示例以反映这一点。不幸的是,它比这个例子要复杂得多,但我这里所说的是它的关键。我个人会尝试重新审视这个设计,看看是否有可能将其更改为不具有该要求,但如果不知道它应该做什么,就很难说这是否可行。