【问题标题】:Copy Constructor going to base constructor and overwriting copied values复制构造函数转到基础构造函数并覆盖复制的值
【发布时间】:2012-01-02 04:42:13
【问题描述】:

构造函数难题,我有这两个构造函数。一个是用于制作类的副本,另一个是标准构造函数。我需要调用第一个,以便我可以使用其中的规则。我不应该重复代码,所以我正在寻找一种方法来避免覆盖两个维度。

public SprinklerLineModel()
    {

        NearCrossMainDimension = new PipeDimensionModel();
        FarCrossMainDimension = new PipeDimensionModel();

        this.AddValidationRule(Rule.CreateRule(() => BranchLineDiameter, RuleMessage.GREATER_THAN_ZERO, () => BranchLineDiameter > 0));
    }

    /// <summary>
    /// Copy Constructor
    /// </summary>
    /// <param name="sprinklerLineModel">Original copy of sprinklerLineModel</param>
    public SprinklerLineModel(SprinklerLineModel sprinklerLineModel)
        :this()
    {
        this.EstimatedFlow = sprinklerLineModel.EstimatedFlow;
        this.EstimatedPressure = sprinklerLineModel.EstimatedPressure;
        this.NearCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.NearCrossMainDimension);
        this.FarCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.FarCrossMainDimension);
        this.BranchLineDiameter = sprinklerLineModel.BranchLineDiameter;
        this.LeadLinePipeFittingLength = sprinklerLineModel.LeadLinePipeFittingLength;
        this.ExbPipeFittingLength = sprinklerLineModel.ExbPipeFittingLength;

        this.IsDirty = sprinklerLineModel.IsDirty;
    }

我希望能够在不覆盖两个变量的情况下调用默认构造函数。任何帮助,将不胜感激。

我想我可以检查一下它们是否为空,但这似乎不是最好的方法。

谢谢

【问题讨论】:

    标签: c# constructor overloading copy-constructor default-constructor


    【解决方案1】:

    我会提取一个初始化方法并从两个构造函数中调用该方法。

    public SprinklerLineModel()
    {
        NearCrossMainDimension = new PipeDimensionModel();
        FarCrossMainDimension = new PipeDimensionModel();
        Init();
    }
    
    public SprinklerLineModel(SprinklerLineModel sprinklerLineModel)
    {
        this.EstimatedFlow = sprinklerLineModel.EstimatedFlow;
        this.EstimatedPressure = sprinklerLineModel.EstimatedPressure;
        this.NearCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.NearCrossMainDimension);
        this.FarCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.FarCrossMainDimension);
        this.BranchLineDiameter = sprinklerLineModel.BranchLineDiameter;
        this.LeadLinePipeFittingLength = sprinklerLineModel.LeadLinePipeFittingLength;
        this.ExbPipeFittingLength = sprinklerLineModel.ExbPipeFittingLength;
        this.IsDirty = sprinklerLineModel.IsDirty;
        Init();
    }
    
    void Init()
    {
        this.AddValidationRule(Rule.CreateRule(() => BranchLineDiameter, RuleMessage.GREATER_THAN_ZERO, () => BranchLineDiameter > 0));
    }
    

    【讨论】:

      【解决方案2】:

      我会这样做:

      public SprinklerLineModel()
          : this(null)
      {
      }
      
      /// <summary> 
      /// Copy Constructor 
      /// </summary> 
      /// <param name="sprinklerLineModel">Original copy of sprinklerLineModel</param> 
      public SprinklerLineModel(SprinklerLineModel sprinklerLineModel)
      {
          this.EstimatedFlow = sprinklerLineModel.EstimatedFlow;
          this.EstimatedPressure = sprinklerLineModel.EstimatedPressure;
          if (sprinklerLineModel != null)
          {
              this.NearCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.NearCrossMainDimension);
              this.FarCrossMainDimension = new PipeDimensionModel(sprinklerLineModel.FarCrossMainDimension);
          }
          else
          {
              NearCrossMainDimension = new PipeDimensionModel();
              FarCrossMainDimension = new PipeDimensionModel();
          }
          this.BranchLineDiameter = sprinklerLineModel.BranchLineDiameter;
          this.LeadLinePipeFittingLength = sprinklerLineModel.LeadLinePipeFittingLength;
          this.ExbPipeFittingLength = sprinklerLineModel.ExbPipeFittingLength;
      
          this.IsDirty = sprinklerLineModel.IsDirty;
      
          this.AddValidationRule(Rule.CreateRule(() => BranchLineDiameter, RuleMessage.GREATER_THAN_ZERO, () => BranchLineDiameter > 0));
      }
      

      优点是您可以在一个地方实现。

      /蒂比

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 1970-01-01
        • 2015-03-06
        • 1970-01-01
        • 2013-06-23
        相关资源
        最近更新 更多