2009-05-11 8 views
13

속성을 가지는 클래스 InnerClass와 getter/setter가 있다고 가정합니다. InnerClass를 포함하는 OuterClass 클래스도 있습니다.클래스 C에있어서의 getter 및 setter #

class InnerClass 
{ 
    private int m_a; 
    private int m_b; 

    public int M_A 
    { 
     get 
     { 
      return m_a; 
     } 
     set 
     { 
      m_a = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass innerClass 
} 

OuterClass의 innerClass 멤버에 대해 올바른 getter 및 setter를 구현하려면 어떻게해야합니까?

미리 감사드립니다.

+0

"set"은 {m_a = value;} –

+0

당신이 알고있는 담당자를 가지고 있어야합니다.) – annakata

답변

24

구문은 전혀 다를 수 없습니다. 당신이 .NET 3.5에서 C#을 사용하는 경우 당신이 가진 모든 그냥 읽고 뒷면에 ​​기록 간단한 속성이 경우 그냥 ...

public InnerClass InnerClass 
{ 
    get { return innerClass; } 
    set { innerClass = value; } 
} 

그런데, 당신은 자동 속성 생성 기능을 사용할 수 있습니다 상점 (위와 같이).

public InnerClass InnerClass { get; set; } 

이 자동으로 저장을위한 전용 멤버를 생성은 다음 get에에서 읽고 set에에 기록하십시오 sytax는 추상적 인 재산의 그것과 유사하다.

2
public InnerClass InnerClass 
    { 
     get 
     { 
      return innerClass; 
     } 
     set 
     { 
      innerClass = value; 
     } 
    } 
0

내부 클래스의 작동 방식에 따라 다릅니다.

+0

getter에서 인스턴스를 반환하기 때문에 실제로는 아닙니다. 이 작업을 수행하는 유일한 방법은 (이 방법은 약간 냄새 나는 것입니다 ...) 동일한 CopyFrom 메서드를 사용하여 getter에서 새 인스턴스를 반환하는 것입니다. –

+0

나는 당신이 오해했다고 생각합니다. 요점은 인스턴스를 수정할 수 있지만 OuterClass의 인스턴스를 통해 명시 적으로해야한다는 것입니다. 예 OuterClass.InnerClass foo = new OuterClass.InnerClass(); foo.M_A = 1; outerInstance.InnerClass = foo; //outerInstance.InnerClass.M_A는 1과 같습니다. foo.SomeProperty = 2; // outerInstance.InnerClass.M_A는 여전히 1 outerInstance와 같습니다.InnerClass = foo; //outerInstance.InnerClass.M_A는 2와 같습니다. – James

0

당신이 만약 .. 이런 식으로 일을함으로써

public InnerClass InnerClass{ 
    get{ return innerClass; } 
    set{ innerClass.CopyFrom(value); /* Pseudo method call */ } 
} 

, 당신이 OuterClass을하지 않는 인스턴스를 명시 적으로 조작에서 외부 코드를 방지 : 외부 클래스를 "소유"내부 클래스,이 경우에 필요할 수 있습니다 내부 클래스 자체를 노출시키지 않고 내부 클래스 멤버에 액세스하는 것을 의미하므로 다음 코드를 사용할 수 있습니다. this.innerClass 만 노출하려는 경우 InnerClass 필드를 노출하는 방식에 차이가 없습니다.

class InnerClass 
{ 
    private int _a; 
    public int a 
    { 
     get 
     { 
      return _a; 
     } 
     set 
     { 
      _a = value; 
     } 
    } 

    private int _b; 
    public int b 
    { 
     get 
     { 
      return _b; 
     } 
     set 
     { 
      _b = value; 
     } 
    } 
} 

class OuterClass 
{ 
    private InnerClass _innerClass; 
    public InnerClass innerClass 
    { 
     get 
     { 
      return _innerClass; 
     } 
     set 
     { 
      _innerClass = value; 
     } 
    } 
} 

이 두 정의는 암시 적으로 동일합니다으로이 암시 적으로 동일

class InnerClass 
{ 
    public int a{ get; set; } 
    public int b{ get; set; } 
} 

class OuterClass 
{ 
    public InnerClass innerClass{ get; set; } 
} 

:

class OuterClass 
{ 
    private InnerClass innerClass 

    public int M_A 
    { 
     get 
     { 
      if (this.innerClass != null) 
      { 
       return this.innerClass.M_A; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
     set 
     { 
      if (this.innerClass != null) 
      { 
       this.innerClass.M_A = value; 
      } 
      else 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
    } 
} 
+0

질문의 일부를 놓치지 않았다면 어떻게 적용할지는 모르겠지만 ... 그가 물어 본 것입니까? –

+0

그냥 궁금해서 - 왜 게터에 잘못된 연산 예외를 던질 것입니까? 나는 당신이 setter에서 이것을하는 이유를 이해하지만, 보통 getter가 수동적이라고 생각하지 않습니까? – BenAlabaster

+0

"[...] getter와 setter는 OuterClass의 innerClass 멤버에 대한 질문을 읽었습니다." 추가로 "s"를 "OuterClass의 [...] innerClass 회원으로?"하지만 내 대답을 마친 후에 만 ​​재조정했습니다. –

21

이 일의 가장 우아한 방법은 암시 적 getter 및 setter를 사용하는 것입니다 - 몇 번의 키 스트로크를 뺀 것입니다. 첫 번째 예에서 컴파일러는 필요없는 private 필드를 구현합니다. 그러나 둘째, 진행 상황에 대해 더 많이 제어 할 수 있습니다.

+0

암시 적 게터 및 설정자의 경우 +1 – BobTheBuilder

+2

... 내 답변과 다른 점은 무엇입니까? –

+1

또한 그는 사용중인 C#/.NET의 버전을 알려주지 않습니다. 암시 적 속성은 .NET 3.5/C# 3.0의 일부입니다. –