2012-12-10 2 views
3

가능한 중복 :
Why can’t I access C# protected members except like this?C#의 인스턴스 멤버에 대한 액세스가 제한되어 있습니까?

나는이 코드를보고

(C#을 모두 까다로운 부분을 보여줍니다 특별한 주석 버전) 교류 # 책을 읽고 있었다으로 :

public class A 
{ 
    protected int x; 
    static void F(A a, B b) 
    { 
     a.x = 1; // Okay 
     b.x = 1; // Okay 
    } 
} 
public class B: A 
{ 
    static void F(A a, B b) 
    { 
     a.x = 1; // Error: must access through instance of B 
     b.x = 1; // Okay 
    } 
} 
meanning 있는지보고

:

질문

  • 이 클래스에서 파생 된이 클래스 나 클래스에 제한

    액세스하는 이유는 무엇입니까이 제한 (인스턴스를 통해) 존재 하는가?

  • 은 허용되는 것처럼 문제가있는 상황의 예를 제공 할 수 있습니까?

+0

이 예제는 msdn이며 중요한 부분을 제거했습니다. A에서는 A와 B의 인스턴스를 통해 x에 액세스 할 수 있습니다. 두 경우 모두 A의 인스턴스 또는 A. 그러나 B에서 A는 A의 인스턴스를 통해 x에 액세스 할 수 없습니다. A는 B에서 파생되지 않기 때문에 x에서 C를 유도 할 수도 있습니다. 당신은 현존하는 클래스 인스턴스 변수에 접근 할 수 있습니다. – Najzero

답변

2

보호 귀하의 인용 의미는 기술적 인 정의가 아니라 단지 어떤 직관적 인 의미 (섹션 3.5.1)와 같은 사양의 따옴표 :

보호의 직관적 인 의미는 "포함 된 클래스에서 파생 된 클래스 (들)을 포함하는 에 대한 액세스가 제한됩니다"입니다.

더 내려 동일한 부분에 좀더 엄격한 정의를 제공한다 (여기서 M은 타입 T의 구성원)

그렇지 M이 보호되는 경우가 를 발생하면, 상기 액세스가 허용 M이 선언 된 클래스 내에서 또는 M이 선언 된 클래스에서 파생 된 클래스 내에서 발생하고 이 파생 클래스 유형 (3.5.3)을 통해 발생하는 경우

참조 섹션 (3.5.3) 보호 부재 액세스에 대한 구체적이고 참고하여 예를 포함

이 제한 방지 부재는 동일한 기본 클래스에서 상속되는 경우에도, 다른 파생 클래스 부재를 보호 액세스 한 파생 클래스 .

따라서 대답은 분명합니다. 다음과 같은 일을에서 세 번째 클래스를 방지하기 위해 설계되었습니다

public class C : A 
{ 
    public static void F(A a, B b, C c) 
    { 
    a.x = 1; // not allowed 
    b.x = 1; // not allowed 
    c.x = 1; // allowed 
    } 
} 

를 처음 두 과제가 허용 될 protected의 당신의 정의와 함께. 이것은 다소 이상 할 것입니다. 내가 도서관을 가지고 있는데 AB을 정의했지만 A에서 상속 받도록하고 C이라고 썼습니다. 나는 라이브러리 작성자로서 내가 쓴 클래스의 인스턴스에서 내부의 세부 사항을 수정할 수 있다는 것에 놀랄 것이다. 물론필드의 수정을 속성 또는 메소드를 통해 C에 표시 할 수 있지만 해당 동작은 클래스 C의 인스턴스로 제한됩니다.