2017-12-21 28 views
0

와 속성 내가 espacially 상속, C#의 속성에 대한 혼란 스러워요 :클래스 변수 및 상속

나는 예로서 포켓몬 클래스를 가지고 있고 (예를 들어 통계는 서브 클래스에서이를 수정하기 위해 보호되어야 할 수준 ups에) 나는 외부에서 stats를 읽고 싶다. 짧은 형식이 거기에 있습니다 :

// base class 
abstract class Pokemon 
{ 

    // stats 

    protected int hp; 
    public int Hp { 
     get 
     { 
      return hp; 
     } 
     protected set 
     { 
      hp = value; 
     } 
    } 

    // other stats... 
} 

내 질문은 :

이 할 수있는 자세한 방법이 될 것이다? 예 :

// base class 
abstract class Pokemon 
{  
    // stats 

    public int Kp { get; protected set; } 

    // other stats... 
} 

이 두 클래스는 비슷하게 작동합니까?

나는 때문에 공공 getter 및 setter 당신이 쓰기에 대한 혼란 스러워요 :

// base class 
abstract class Pokemon 
{  
    // stats 

    public int Kp { get; set; } 

    // other stats... 
} 

그리고 그것은 다음과 같이 작동 하나 내가 선호한다

// base class 
abstract class Pokemon 
{ 
    // stats 

    private int kp; 
    public int Kp { 
     get 
     { 
      return kp; 
     } 
     set 
     { 
      kp = value; 
     } 
    } 

    // other stats... 
} 

?

+2

가 왜 혼란을 사용하지 않는? 어떻게 다르게 작동합니까? – SLaks

+0

왜 귀하의 후원 필드가 '보호'됩니까? – SLaks

+0

"내 질문은 : 이것에 대한 짧은 양식이 있습니까?"당신이 그것을 시도해 봤니? 물론 자동 속성은 다른 접근 수정자를 가질 수 있습니다. – HimBromBeere

답변

2

내 질문 : 짧은 양식이 있습니까?

예 당신이 그것을 쓴 그대로

이 2 개 클래스와 유사하게 작동합니까?

예, 첫 번째 예에서는 추가로 파생 클래스에서 hp 필드를 직접 조작 할 수 있습니다. (개인적으로 나는 요점을 보지 못합니다. private)

어느 것을 선호합니까?

말하기 어렵습니다. 속성의 설정을 확인하기 위해 추가 로직이 필요한 경우 첫 번째 옵션을 사용하십시오. 당신이 그것을 필요하지 않은 경우

private const int maxHP = 3000; 
protected int hp; 
public int Hp { 
    get 
    { 
     return hp; 
    } 
    protected set 
    { 
     // extra validation 
     if(value < maxHP) 
      hp = value; 
     else 
      hp = maxHP; 
    } 
} 

,