我有一个Cube类。可以约束多维数据集以便width=height=length
。我编写了这个功能,但正如您所看到的,我的代码会产生循环/无限循环 - the width sets the height which sets the width which sets the height and so on
。
如何限制我的Cube类并避免这种无限循环?我唯一的解决方案是使用布尔变量propagate
(见下文)?
public class Cube {
public bool isConstrained {get; set;} // if constrained then width=height=length
// Causes a circular problem. How can I avoid this? Maybe create a variable private bool propagate = false; ??
public double width
{
get { return width; }
set
{
width = value;
if (isConstrained)
{
height = value;
length = value;
}
}
}
public double height
{
get { return height; }
set
{
height = value;
if (isConstrained)
{
width = value;
length = value;
}
}
}
public double length
{
get { return length; }
set
{
length = value;
if (isConstrained)
{
height = value;
width = value;
}
}
}
}
我唯一的解决方案是:
private bool propagate = true;
public double length
{
get { return length; }
set
{
length = value;
if (isConstrained && propagate)
{
propagate = false;
height = value;
width = value;
propagate = true;
}
}
}
答案 0 :(得分:4)
目前,即使只是你的getter会给堆栈溢出 - 你没有任何字段支持你的数据,因为你没有使用自动实现的属性。此外,您的属性没有传统名称,这绝对值得修复。
您应该使用私有字段来支持属性,并在属性设置器中相应地设置它们。那样的话,没有一个属性可以调用另一个属性,一切都会很好......除了设计开始时有点麻烦。 (当改变一个属性改变另一个属性时,这可能会令人惊讶。)
类似于:
private int width;
private int height;
private int length;
private bool constrained;
...
public int Width
{
get { return width; }
set
{
width = value;
if (constrained)
{
height = value;
length = value;
}
}
}
答案 1 :(得分:3)
立方体的长度,宽度和高度是否应该相同?您可以使用单个私有变量来保存长度,宽度和高度,然后在设置任何这些属性时,将该值分配给私有变量。在get Properties中为宽度/高度/长度返回相同变量的值。