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