2011-09-13 3 views
1

클래스 A는 추상 클래스이며 상속 된 클래스 B가 제공해야하는 읽기 전용 속성을 정의한다고 가정 해 보겠습니다. 이 추상적으로 설정하거나 보호 등의 속성을 정의하는 좋은 연습은 다음과 같습니다읽기 전용 속성 상속 : 추상 또는 설정 보호

public abstract class A 
{ 
    public abstract int Value { get; } 
} 
public class B : A 
{ 
    public override int Value { get { return 1; } } 
} 

또는

public abstract class A 
{ 
    public int Value { get; protected set; } 
} 
public class B : A 
{ 
    public B() 
    { 
     Value = 1; 
    } 
} 

내가 처음 솔루션은 아마 더 낫다고 생각하지만 난 다른 의견을 듣고 싶습니다.

답변

0

읽기 전용으로 무엇을 의미하는지에 따라 다릅니다. 호출자에 대해 읽기 전용을 의미하는 경우 두 번째 솔루션을 선호합니다.

첫 번째 해결책은 하위 클래스가 get을 구현하도록 강제합니다. 그러나 어린이가 set (심지어 보호 된 것)을 구현하는 것을 금지합니다. 이는 나쁘다.

두 번째 해결 방법을 사용하면 전체 Value 인터페이스가 기본 클래스로 정의되며,이 옵션은 선택시 Value를 설정할 수 있습니다. 또한 좋은 값입니다.

반면에 "읽기 전용"은 진정한 읽기 전용이라는 것을 의미합니다. 하위 클래스조차도 값을 설정할 수 없다는 점에서 첫 번째 해법이 더 좋습니다. 설정하려고하면 올바른 컴파일 오류가 발생합니다.

+0

나는 좋은 점을 가지고 있고 아무도 기여하지 않았기 때문에 대답을 받아 들일 것입니다. 그러나 그 동안 나는 솔루션 1을 사용하여 끝났습니다. 솔루션 2를 사용하여 다음을 고려하십시오. 세 번째 클래스 C가 B에서 상속 받고 해당 값을 노출하려고합니다. 또한 값은 일정하지 않지만 B와 C의 많은 메소드에서 설정됩니다. C가 제공해야하는 메소드 대신 메소드 중 하나를 실행하는 동안 B가 값을 제공 할 수 있습니다. 즉, C가 해당 속성을 올바르게 재정의하지 못합니다. 그래서 나는 해결책 1이 일반적으로 더 적절하다고 결론을 내렸다. – Zmaster