【问题标题】:C# alternate parameterless constructorC# 备用无参数构造函数
【发布时间】:2013-12-21 02:13:46
【问题描述】:

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

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

我可以这样做吗?

【问题讨论】:

  • 你建议用什么语法来调用这个其他构造函数? var x = new Foo();
  • 您尝试这样做有什么特别的原因吗?听起来有点像X-Y Problem

标签: c# constructor multiple-constructors


【解决方案1】:

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

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

class Foo
{
    public static Foo SpecialFoo()
    {
        return new Foo();
    }
}
var instance1 = new Foo();
var instance2 = Foo.SpecialFoo();

【讨论】:

    【解决方案2】:

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

    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隐藏基类工厂方法,否则会收到警告,而且在基类上隐藏静态成员通常是不好的做法。

    【讨论】:

    • 静态方法有效,但打破了开闭原则。每次需要特殊功能时,都需要修改类。
    • @DmitryS。我同意,如果Foo 是可继承的,更好的解决方案是使用单独的构造函数。我刚刚用适当的解决方案更新了我的答案。
    【解决方案3】:

    你可以这样做:

    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
        }
    }
    

    【讨论】:

    • 我不喜欢这个,因为它无法扩展。
    • 规模是什么意思?多重继承?
    • 如果你需要 10 个“特殊”构造函数,你就有 10 个额外的类型。
    • 不,你定义了 10 个子类。它并不比拥有 10 种方法贵多少。但是有接口的工厂可能是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2011-03-15
    • 2011-10-08
    • 1970-01-01
    • 2015-09-12
    • 2018-06-03
    • 2011-09-25
    相关资源
    最近更新 更多