如何同时调用基本和重载的构造函数?

时间:2019-01-21 21:24:08

标签: c#

我想通过this调用重载的ctor,并通过base调用基本ctor,如下所示。

public Child(string msg, DateTime dt) : base(msg, dt), this(msg)
    => WriteLine($"Child at {dt.Second}");

显然不会编译。

问题

如何同时调用两者?不可能吗 请注意,我并不是在问如何通过重新排列相应的ctor内容来调用它们。

using System;
using static System.Console;

class Parent
{
    public Parent(string msg)
        => WriteLine($"Parent {msg}");

    public Parent(string msg, DateTime dt) : this(msg)
        => WriteLine($"Parent at {dt.Second}");
}
class Child : Parent
{
    public Child(string msg) : base(msg)
        => WriteLine($"Child {msg}");

    public Child(string msg, DateTime dt) : base(msg, dt)//, this(msg)
        => WriteLine($"Child at {dt.Second}");
}
class Program
{
    static void Main()
        => new Child("hi", DateTime.Now);
}

2 个答案:

答案 0 :(得分:2)

是的,这是不可能的。 C#中没有这样的构造。原因是构造器总是调用基础的构造器。当没有由base(…)表示的特定构造函数时,将调用默认构造函数。

但是,简单的私有方法将达到相同的目的:

class Child : Parent
{
    public Child(string msg) : base(msg)
        => ChildInit(msg);

    public Child(string msg, DateTime dt) : base(msg, dt)
    {
        ChildInit(msg);
        WriteLine($"Child at {dt.Second}");
    }

    private void ChildInit(string msg)
        => WriteLine($"Child {msg}");
}

答案 1 :(得分:0)

这是一个下注,但是也许factory pattern可以帮助您吗?基本上,您没有公共构造函数,而是一个静态函数来创建实例。

问题在于,构造函数中显然有很多逻辑。可能逻辑太多。使用Factory模式的常见原因有两个:

  • 您想使用单例模式。工厂只是您必须采取的垫脚石。
  • 同时需要完成一些工作:对于类用户来说太复杂了,对于构造函数来说太复杂了,必须在运行时完成

构造函数本质上不是正常函数。而且这种非正常现象可能会成为障碍。反过来,工厂函数只是普通的静态函数,可以随时随地调用它们。通过提供自己的Factory函数,一个类可以成为自己的Factory。

尽管我不能命名,但我无法摆脱这种绕过限制的感觉可能是一个坏主意。通常存在这些限制的原因是,您仅在之后意识到这是延迟更改路径的方法。而且我通常根本不会碰到类型安全。