2

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

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

我想能够调用默认的构造函数而不覆盖这两个变量。任何帮助,将不胜感激。

我想我可以检查一下,看看它们是否为空,但看起来好像不是最好的方法。

感谢

回答

0

我会抽出一个初始化方法和电话会议上说,从两个构造方法。

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)); 
} 
0

我会做这样的事情:

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

的好处是,你必须在一个地方implemntation。

/Tibi