C#备用无参数构造函数
可以为C类定义一个备用的无参数构造函数吗 换句话说,我有一个类C#备用无参数构造函数,c#,constructor,multiple-constructors,C#,Constructor,Multiple Constructors,可以为C类定义一个备用的无参数构造函数吗 换句话说,我有一个类Foo。我想要一个默认构造函数Foo()和另一个构造函数SpecialFoo()。我不介意SpecialFoo()构造函数是否调用Foo()构造函数 我可以这样做吗?您只能有一个具有给定参数集的构造函数,因此您不能有两个无参数构造函数 您可以使用另一个publicstaticfoo SpecialFoo方法,它将是工厂方法,并将返回Foo类的新实例,但要使用它,您不会使用new关键字: class Foo { public s
Foo
。我想要一个默认构造函数Foo()
和另一个构造函数SpecialFoo()
。我不介意SpecialFoo()
构造函数是否调用Foo()
构造函数
我可以这样做吗?您只能有一个具有给定参数集的构造函数,因此您不能有两个无参数构造函数 您可以使用另一个
publicstaticfoo SpecialFoo
方法,它将是工厂方法,并将返回Foo
类的新实例,但要使用它,您不会使用new
关键字:
class Foo
{
public static Foo SpecialFoo()
{
return new Foo();
}
}
构造函数与方法一样,不能具有具有相同参数列表的重载。但是,您可以创建静态工厂方法,如下所示:
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);
这样称呼它:
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);
另一种方法是使用单独的构造函数,如下所示:
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);
这样称呼它:
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);
当然,这实际上不符合“备用无参数构造函数”的条件,但它比静态工厂有一些好处。首先,您可以在继承类中使用和扩展它,这是factory方法不允许的*
*实际上,您可以这样做,但您需要使用new
隐藏基工厂方法,否则您将收到警告,通常在基类上隐藏静态成员是不好的做法。您可以这样做:
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
}
}
您建议使用什么语法来调用这个其他构造函数<代码>变量x=新的Foo()代码>您尝试这样做有什么特别的原因吗?这听起来有点像一个。我不喜欢这个,因为它不可缩放。你说的缩放是什么意思?多重继承?如果你需要10个“特殊”构造函数,你就有10个额外的类型。不,你定义了10个子类。它并不比有10种方法贵多少。但是有接口的工厂可能是更好的方法。静态方法可以工作,但它打破了开放-封闭原则。每次需要特殊函数时,都需要修改该类。@DmitryS。我同意,如果
Foo
是可继承的,更好的解决方案是使用单独的构造函数。我刚刚用一个合适的解决方案更新了我的答案。