2014-06-16 1 views
0

나는 Cube 클래스를 가지고 있습니다. 큐브는 width=height=length이되도록 구속 될 수 있습니다. 이 코드를 코딩했지만 알 수 있듯이 내 코드는 순환/무한 루프가됩니다 (the width sets the height which sets the width which sets the height and so on).관련 속성 : 무한 루프를 피하는 방법

내 큐브 클래스를 제한하고이 무한 루프를 피하려면 어떻게해야합니까? 부울 변수 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

현재도 단지 스택 오버플로 제공됩니다 게터 - 당신이 automatically- 사용하지 않는 때문에, 데이터를 백업하는 모든 필드를 필요는 없습니다 구현 된 속성 또한 속성에는 기존 이름이 없으므로 수정해야 할 가치가 있습니다.

개인 필드를 사용하여 속성을 백업하고 속성 설정자 내에서 적절하게 설정해야합니다. 그런 식으로 재산을 다른 사람에게 부르지 않으며, 모든 것이 잘 될 것입니다 ... 시작하기에 약간 번거로운 디자인을 제외하고는. (하나 개의 속성이 다른 변경 변경하는 경우, 그것은 놀라운 일이 될 수 있습니다.)

그래서 같은 것이 :

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

thats 좋은 해결책, 나는 그것을 해결하는 더 우아한 방법이 있기를 바랐다. 왜냐하면이 해결책은 너비, 높이, 길이 등등을위한 2 개의 변수/속성을 포함하기 때문이다. –

+0

큐브이다 .... 왜 sideSize 속성을 가지고 있지 않습니까? –

+0

@MillieSmith lol 예 큐브는 다시해야하지만 다시 다각형을위한 다른 클래스가 필요합니다. 이 방법으로 큐브 또는 다각형이 될 수있는'Cube' 클래스를 만들 수 있습니다. –

3

큐브는 항상 길이, 너비 및 높이가 동일하지 하는가? 하나의 개인 변수를 사용하여 길이, 너비 및 높이를 유지 한 다음 해당 등록 정보를 설정할 때 해당 값을 개인 변수에 할당 할 수 있습니다. width/height/length에 대한 get 속성에서 같은 변수의 값을 반환합니다.

관련 문제