2014-06-16 100 views
0

我有一個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; 
     } 
    } 
} 
+1

爲什麼不是私人領域? – Mephy

+0

@Mephy我不太明白這將如何解決我的問題?我的目標是讓人們能夠從外部(公共)設置立方體屬性,但是當立方體受到限制時,我設置了寬度,我希望高度和長度也會改變(以寬度值)。 –

回答

4

目前甚至只是你的干將會給一個堆棧溢出 - 因爲你不使用你自動調整廣告沒有任何支持的字段數據,實施的屬性。此外,你的屬性沒有傳統的名字,這絕對值得修復。

您應該只使用私有字段來備份屬性,並在屬性設置器中相應地設置這些屬性。這樣沒有財產會叫另一個,一切都會好起來的......除了設計有點麻煩的開始。 (當改變一個屬性將改變另一個,這可奇怪的。)

因此,像:

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

這是一個很好的解決方案,我希望有一個更優雅的方式來解決它雖然 - 因爲這個解決方案涉及2'變量/屬性'的寬度,高度,長度等。 –

+0

這是一個立方體.... ..爲什麼不只是有一個sideSize屬性? –

+0

@MillieSmith哈哈是一個立方體應該但我會再次需要另一個類的多邊形。通過這種方式,我可以將1個「Cube」(我應該將其重命名爲「Polygon」),它可以是立方體或多邊形。 –

3

不應該立方體總是有長度,寬度和高度是一樣的嗎?您可以使用單個私有變量來保存長度,寬度和高度,然後在設置任何這些屬性時將該值分配給私有變量。返回get/Properties/width/length中相同變量的值。