C#备用无参数构造函数

C#备用无参数构造函数,c#,constructor,multiple-constructors,C#,Constructor,Multiple Constructors,可以为C类定义一个备用的无参数构造函数吗 换句话说,我有一个类Foo。我想要一个默认构造函数Foo()和另一个构造函数SpecialFoo()。我不介意SpecialFoo()构造函数是否调用Foo()构造函数 我可以这样做吗?您只能有一个具有给定参数集的构造函数,因此您不能有两个无参数构造函数 您可以使用另一个publicstaticfoo SpecialFoo方法,它将是工厂方法,并将返回Foo类的新实例,但要使用它,您不会使用new关键字: class Foo { public s

可以为C类定义一个备用的无参数构造函数吗

换句话说,我有一个类
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
是可继承的,更好的解决方案是使用单独的构造函数。我刚刚用一个合适的解决方案更新了我的答案。