2011-10-31 101 views
0

也许属性不是这样的方式,但我正在努力寻找一个好的解决方案的答案。如何最好地处理相互依赖的属性?

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

假设始终是一个只读属性,怎么去处理有关可能影响输出的额外性的任意量的好方法?我觉得这是一个糟糕的(完全错误的!)方式来做到这一点,因为我应该总是能够检索我分配的值。例如,如果我分配B = 3,那么在下一次我调用B而不是获得_A * _C时,我应该能够得到3。

但是,我需要这种相互依存的存在(或完全不同的方法来达到相同的目标)。所有的值都是相关的,所以我需要改变一个值来反映其他值。

我只是想不出适当的方式来做到这一点。

编辑

我做了一个坏榜样。实际上,非A值不依赖于A,而只是彼此相关 - B影响C,C影响D等等;然而,A只是这些值的一些组合。不知道这是否是最好的方法,但认为这是值得一提的。

+0

也许我错过了它,但谁指派_A? – MerickOWA

+0

你说得对。我已经添加了它,但这不代表我尝试应用此问题的问题。随着我的工作,A纯粹是一个输出,并不会被分配。 – KarlHungus

回答

3

看来,称它属性A并没有很好地描述它。如果你有一个叫做SolveForA()的方法,它会更有意义。其他人也一样。使用WriteOnly属性仍然可能是有道理的,但我也会制作这些方法。

+0

我想通过这些方面的东西将是最好的方式去做。不幸的是,我担心我的榜样不是最好的。随着我的工作,其他值不依赖于A,但只有彼此。 A只是其他值的组合。 – KarlHungus

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