2017-03-29 21 views
0

변수 멤버와 함수 멤버로 구성된 클래스가 있습니다. 변수 구성원이 간혹 변경됩니다. 변수가 변경되면 함수가 자동으로 호출되기를 원합니다. 즉, 클래스 내에서 변수를 어떻게 묶을 수 있습니까?변수 변경시 함수가 자동으로 호출되는 방법은 무엇입니까?

class line 
{ 
    double x, y; // The poition of the lind end. The line starts at the origin (0,0) 
    double l; // The length of the line 
    void length() 
    { 
     l = Math.sqrt(x*x+y*y); 
    } 
} 

위 예제에서 x와 y가 변경 될 때 업데이트 할 길이가 필요합니다.

+0

이 메커니즘이 어떻게 작동하는지 생각해 보시겠습니까? 이것은 마법이 아닙니다 ... x와 y의 값을 검사하고 메소드가 변경되면 메소드를 호출해야합니다 ... –

+4

[변수의 값이 변경 될 때 이벤트를 트리거하는 방법] 가능한 복제본 (http :// /stackoverflow.com/questions/5842339/how-to-trigger-event-when-a-variables-value-is-changed) – Reddy

답변

3

변수를 속성으로 설정 한 다음 함수를 설정된 액세스에 배치합니다. 이 속성을 정의하면

class line 
{ 
    double _x, _y; 

    double x 
    { 
     get { return _x; } 
     set 
     { 
      _x = value; 
      length(); 
     } 
    } 

    double y 
    { 
     get { return _y; } 
     set 
     { 
      _y = value; 
      length(); 
     } 
    } 

    double l; // The length of the line 

    void length() 
    { 
     l = Math.Sqrt(_x * _x + _y * _y); 
    } 
} 
+0

감사합니다. 이제 또 다른 문제가 있습니다. 나는 x와 y를 클래스 위에 감쌌다. 따라서 x 및 y는 설정하지 않고 업데이트됩니다. 변수를 설정하지 않으므로 length()를 호출하지 마십시오. –

+0

이벤트 및 이벤트 핸들러를 살펴볼 수 있습니다. –

1

당신은 속성

int x 
int X { 
    get { return x; } 
    set { x = value; YouMethod();} 
} 
2

, 클래스에, 당신은 XYautoprops는, 이들 값으로부터 계산 된 읽기 전용 속성 L을 할 수 있습니다 :

public class Line //class names should be Capitalized 
{ 
    public double X{ get; set; } //prop names should be Capitalized 
    public double Y{ get; set; } 
    public double L{ 
    get{ 
     return Math.Sqrt(X * X + Y * Y); 
    } 
    } 
} 
0

BenJ가 지적한 것처럼 속성을 사용할 수 있습니다.

x 및 y를 클래스 내부의 간단한 필드로 선언하는 대신.

private double x; 
public double X 
get 
    { 
     return this.x; 
    } 

    set 
    { 
     this.x = value; 

     this.length() 
     //Above line will call your desired method 
    } 
1
  1. 당신은

    double Length 
    { 
        get { return Math.sqrt(x*x+y*y); } 
    } 
    

    주의해야 할 점처럼 계산 된 속성을 사용하여 매우 비슷한 동작을 달성 할 수있는 그 계산이 Length에 각각의 호출에 따라 수행된다 : 당신은 속성으로 다음과 같은 방법을 선언 할 수 있습니다 xy이 변경되지 않은 경우에도 마찬가지입니다.

  2. 당신은 속성으로 당신에게 xy 필드를 캡슐화하고

    double X 
    { 
        get { return x; } 
        set 
        { 
         x = value; 
         length(); 
        } 
    } 
    
    double Y 
    { 
        get { return y; } 
        set 
        { 
         y = value; 
         length(); 
        } 
    } 
    

    처럼 세터에서 length 함수를 호출하고 만 XY 속성을 통해 xy을 변경할 수 있습니다.