C# 来自互斥构造函数的通用初始化
假设我有一个简单的基类,其中包含用于不同场景的互斥构造函数C# 来自互斥构造函数的通用初始化,c#,C#,假设我有一个简单的基类,其中包含用于不同场景的互斥构造函数 abstract class ExampleA { protected ExampleA(int intParam) { } protected ExampleA(string stringParam) { } } 我的子类大部分只需要实现一个扩展了一个基构造函数的构造函数。一切都很好。但是,我有一个特殊的情况,其中必须在我的标准工作流之外初始化子类 class ExampleB
abstract class ExampleA
{
protected ExampleA(int intParam)
{
}
protected ExampleA(string stringParam)
{
}
}
我的子类大部分只需要实现一个扩展了一个基构造函数的构造函数。一切都很好。但是,我有一个特殊的情况,其中必须在我的标准工作流之外初始化子类
class ExampleB : ExampleA
{
private readonly int myMagicInt;
public ExampleB(ExampleC instanceC)
: base(instanceC.someString)
{
// Derive readonly values here.
}
public ExampleB(ExampleD instanceD)
: base(instanceD.someInt)
{
// Derive readonly values here.
}
}
这是我第一次遇到这样一个场景:我无法适当地链接我的构造函数;在这种情况下这样做会比在多个位置初始化只读值带来更多开销
除了重新架构之外,是否有一种方法可以干净地处理这些场景,或者说,如果没有额外的复杂性或开销层,它在C#中根本无法表达
尽管我考虑过以下解决方案,但没有一个比重新架构更吸引我:
- 基础上的参数可以为null,因此可以调用公共构造函数
- 使用另一种方法初始化带有“out”参数的只读值
- 将只读成员更改为私有可设置成员
- 你不能这样做吗?(请注意,我从您的代码中推断了很多,可能会误解您的实际场景):
是否将int传递到第二个构造函数中,如这里的实例所示?我的代码示例是一种简化,这种方法似乎依赖于能够从instanceC或visa派生instanceD。如果这是可能的,我可以添加第三个接受int的私有构造函数,并实现这个模式。
class ExampleB : ExampleA
{
private readonly int myMagicInt;
public ExampleB(ExampleC instanceC)
: this(GetEquivalentIntFromString(instanceC.someString))
{
}
public ExampleB(ExampleD instanceD)
: base(instanceD.someInt)
{
// Derive readonly values here.
}
private static int GetEquivalentIntFromString(string s)
{ //whatever }
}