2

是否可以为 C# 类定义替代的无参数构造函数?

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

我可以这样做吗?

4

3 回答 3

7

你只能有一个给定参数的构造函数,所以你不能有两个无参数的构造函数

你可以有另一个public static Foo SpecialFoo方法,它是工厂方法,会返回类的新实例Foo,但要使用它,你不会使用new关键字:

class Foo
{
    public static Foo SpecialFoo()
    {
        return new Foo();
    }
}
var instance1 = new Foo();
var instance2 = Foo.SpecialFoo();
于 2013-12-21T02:16:19.600 回答
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,否则你会得到一个警告,而且在基类上隐藏静态成员通常是不好的做法。

于 2013-12-21T02:17:02.537 回答
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
    }
}
于 2013-12-21T02:21:26.297 回答