在c# 4中,如何在具有重载构造函数的父类的子类中使用带有可选参数的构造函数?

本文关键字:构造函数 子类 参数 父类 重载 | 更新日期: 2023-09-27 17:55:04

我有一个父类,它有一个重载构造函数,我有一个子类,它有一个带可选参数的构造函数。是否有一种方法可以让子类的构造函数仍然暴露父类的重载性,同时保留它自己的可选参数?

下面是这两个类及其所需构造函数的一些示例代码:
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
    }
}

这是另一个子类构造函数的方法签名,我想也必须暴露父构造函数的重载,但问题是如何做到这一点:

Bar(String arg0, List<x> arg1, List<y> arg2 = null, String arg3 = "")

我想我已经找到了一个解决方案,但我不确定它是否干净。我已经把它作为一个答案,以防万一它是唯一的选择。

在c# 4中,如何在具有重载构造函数的父类的子类中使用带有可选参数的构造函数?

如果您可以将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
    }
}

这是我想到的解决方案:

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
    }
}

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