如何最好地处理相互依赖的属性?

时间:2011-10-31 20:09:00

标签: c# automatic-properties

也许属性不是这样的方式,但我很难找到一个好的解决方案的答案。

public class Blah
{
    public double A { get{ return _B / _C; } }
    public double B
    {
        get{ return _A * _C; }
        set{ _B = value; }
    }
    public double C
    {
        get{ return _B / _A; }
        set{ _C = value; }
    }

    private double _A;
    private double _B;
    private double _C;

    public Blah(){}

    public Blah(double a, double b, double c)
    {
        this._A = a;
        this._B = b;
        this._C = c;
    }
}

假设A始终是只读属性,那么处理可能影响A输出的任意数量的附加属性的好方法是什么?我觉得这是一个糟糕的(完全错误的!)方法,因为我总是应该能够检索我指定的值。例如,如果我指定B = 3,那么下次调用B而不是获得_A * _C时,我应该能够得到3。

但是,我需要存在这种相互依赖性(或者实现相同目标的完全不同的方法)。所有的值都是相关的,所以我需要将一个值的变化反映在其他值中。

我无法找到合适的方法来做到这一点。

修改

我做了一个坏榜样。实际上,非A值不依赖于A,而只相互依赖 - B影响C,C影响D等;但是,A只是这些值的某种组合。不确定这对于如何最好地接近这一点很重要,但认为值得一提。

2 个答案:

答案 0 :(得分:3)

似乎称它为属性A并不能真正描述它。如果你有一个名为SolveForA()的方法,它会更有意义。其他人也一样。使用WriteOnly属性仍然有意义,但我也会制作这些方法。

答案 1 :(得分:0)

在我看来,在示例中,属性被滥用。您已经注意到我们可以预期,如果我们设置值,我们也可以获得相同的值。如果重构代码是我的工作,我想我想从以下内容开始:

public class Blah
{
    public double A { get; private set; }
    public double B { get; set; }
    public double C { get; set; }

    public double CalculateB()
    {
       ...
    }

    public double CalculateC()
    {
       ...
    }

    public Blah(){}

    public Blah(double b, double c)
    {
        this._B = b;
        this._C = c;
    }
}