互斥构造函数的常见初始化

时间:2017-12-06 22:23:19

标签: c#

假设我有一个简单的基类,它具有适用于不同场景的互斥构造函数。

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

这是我第一次遇到无法正确链接构造函数的场景;在这种情况下这样做会比在多个地方初始化我的readonly值引入更多的开销。

没有重新架构,有没有一种方法可以用来干净地处理这些场景,或者它是否在C#中根本无法表达而没有额外的复杂性或开销?

虽然我已经考虑过以下解决方案,但这些解决方案对我来说都不比重新架构更吸引人:

  • 基础上的可空参数,因此可以调用常用的构造函数。
  • 使用另一种方法初始化ReadOnly值并使用' out'参数。
  • 将Readonly成员更改为私人可设置成员。

1 个答案:

答案 0 :(得分:1)

嗯,你不能这样做吗? (请注意,我从您的代码中推断了很多,可能会误解您的实际情况):

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