Копирование конструктора, переход к базовому конструктору и перезапись скопированных значений - PullRequest
2 голосов
/ 20 ноября 2011

Конструктор Conundrum, у меня есть эти два конструктора. Один предназначен для создания копии класса, а другой - стандартный конструктор. Мне нужно позвонить первому, чтобы я мог использовать в нем правило. Мне не нужно повторять код, поэтому я ищу способ избежать перезаписи двух измерений.

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

Я хочу иметь возможность вызывать конструктор по умолчанию без перезаписи двух переменных. Любая помощь будет оценена.

Полагаю, я мог бы проверить и проверить, не являются ли они нулевыми, но это не лучший способ.

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 ноября 2011

Я бы сделал что-то вроде этого:

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

Преимущество в том, что у вас есть реализация в одном месте.

/ Тиби

0 голосов
/ 20 ноября 2011

Я бы извлек метод инициализации и вызвал бы этот метод из обоих конструкторов.

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