是否可以为C#类定义备用无参数构造函数?
换句话说,我有一个班级Foo
。我想要一个默认的构造函数Foo()
和另一个构造函数SpecialFoo()
。我不介意SpecialFoo()
构造函数是否调用Foo()
构造函数。
我能这样做吗?
答案 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
}
}