一个构造函数是否可以包含逻辑来确定调用哪个其他构造函数进行覆盖?

5

在C#中,是否可以在构造函数中决定使用哪个重载构造函数?以下代码无法编译!我不知道该使用哪个调用。

    public IntRange(int val, bool isMax)
        : isMax ? this() : this()
    {
        if (isMax)
        {
            IntRange(0, val);
        }
        else
        {
            IntRange(val, int.MaxValue);
        }
    }

4
不,只需将常见逻辑提取到私有方法中,并根据 isMax 的值在构造函数内调用它们即可。 - vcsjones
3
在调用任何构造函数之前做出这个决定似乎会更好。 - DonBoitnott
3
不在C#中。我认为在IL中可以合法地完成。 - Damien_The_Unbeliever
3个回答

9
如何呢?
    class IntRange {
      public IntRange(int val, bool isMax)
        : this(isMax ? 0 : val, isMax ? val : int.MaxValue) {
      }
      public IntRange(int min, int max) {
      }
    }

如果isMax不会被频繁使用,或者为了方便调用,我可能会将其设置为默认参数(false)。 - d.moncada

2
您可以通过在对象上使用静态方法来实现这种功能,如下所示。
class IntRange {

    public IntRange(int min, int max) {
       // write code here
    }

     public static IntRange Construct(int val, bool isMax) {
         if (isMax) {
             return new IntRange(0, val);
         } else {
             return new IntRange(val, int.MaxValue);
         }
     }
}

你甚至可以将构造函数public IntRange(int min, int max)设为私有的,以强制使用静态方法。

我发现像这样使用静态方法构建对象尤其有用,当我们可能想创建一个子类时。


工厂方法模式。不错。在这种情况下,我通常会将非静态构造函数设为私有,就像你所指出的那样。 - Stephen Kennedy

0

由于构造函数中的语句isMax ? this() : this()在:之后,你只能调用基类构造函数或相同类的重载构造函数,所以它无法编译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接