Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自互斥构造函数的通用初始化_C# - Fatal编程技术网

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