C#alternate无参数构造函数

时间:2013-12-21 02:13:47

标签: c# constructor multiple-constructors

是否可以为C#类定义备用无参数构造函数?

换句话说,我有一个班级Foo。我想要一个默认的构造函数Foo()和另一个构造函数SpecialFoo()。我不介意SpecialFoo()构造函数是否调用Foo()构造函数。

我能这样做吗?

3 个答案:

答案 0 :(得分:7)

您只能拥有一个具有给定参数集的构造函数,因此不能有两个无参数构造函数

您可以使用另一个public static Foo SpecialFoo方法,它将是工厂方法,并将返回Foo类的新实例,但要使用它,您将不会使用{{ 1}}关键字:

new
class Foo
{
    public static Foo SpecialFoo()
    {
        return new Foo();
    }
}

答案 1 :(得分:3)

构造函数与方法一样,不能具有相同参数列表的重载。但是,您可以创建一个静态工厂方法,如下所示:

public class Foo
{
    public static Foo SpecialFoo() {
         ...
    }
}

并称之为:

var foo = new Foo();
var specialFoo = Foo.SpecialFoo();

另一种方法是使用这样的单独构造函数:

public class Foo
{
    public Foo(bool special) : this() {
         if (special)
         {
             ...
         }
    }
}

并称之为:

var foo = new Foo();
var specialFoo = new Foo(true);

当然,这实际上不符合“替代无参数构造函数”,但它比静态工厂有一些好处。首先,您可以在继承的类中使用和扩展它,这是工厂方法不允许的*。

*实际上,您可以,但是您需要使用new隐藏基本工厂方法,否则您将收到警告,并且在基类上隐藏静态成员通常是不好的做法。

答案 2 :(得分:1)

你可以这样做:

public class Foo
{
    public Foo()
    {
        // do something
    }
}

public class SuperFoo : Foo
{
    public SuperFoo() : base() // call the Foo constructor - you do not have to call base explicitely, just a more verbose example
    {
        // do something else
    }
}