2011-03-28 5 views
0

내가 MSDN을 읽는에서 보호 된 액세스 한정자키워드

을 이해하지 보인다 보호, 내가

다음 클래스 A와 액세스로부터 클래스 B 상속을 가지고 클래스 A에 보호 속성을 선언 할 것으로 보인다 재산.

내 문제는 클래스 B를 인스턴스화 할 때 클래스 A 보호 된 메서드에 액세스 할 수 없다는 것입니다. 나는 내가 B의 인스턴스화 된 버전에서 스티브에 액세스 할 수없는 이유에 대한 이론을 찾고,이 코드는 컴파일되지 않습니다 이해

class a 
{ 
protected int steve {get;set} 
} 
class b:a 
{} 

console app 
private foo = new class b(); 
foo.steve = 3; 

아래 사이비 코드는 당신의 도움을 주셔서 감사합니다.

답변

4

protected 구성원은 파생 클래스 내에서 액세스 할 수 있지만 다른 멤버는 private과 같습니다. 의미 :
a 또는 b 또는 다른 파생 유형의 회원에서 steve에 액세스 할 수 있습니다. 외부에서는 steve에 액세스 할 수 없습니다.

+0

private 대답으로이 질문을 선택 다르지 않다. 내 질문과 대답을 읽는 데 시간을내어 주셔서 감사합니다. – gh9

4

클래스 b 외부에서 액세스하고 있습니다. 내부 클래스 b에서 액세스 중이므로 작동합니다.

class a 
{ 
protected int steve {get;set} 
} 

class b:a 
{ 
public void foo() { 
    steve = 4; 
} 
} 
2

Protected 등있어서, 변수를 선언하는 클래스가 사용할 수있는 전용 유사하지만 항 또는 변수뿐만 아니라 하위 클래스에 사용될 노출.

1

"b"는 "a"의 보호 된 멤버를 볼 수 있지만 "b"를 호출하려고하면 "a"보호 된 멤버를 볼 수 없습니다. "steve"를 public으로 만들고 속성에서 "get"및 "set"의 수정자를 변경하여 다른 결과를 얻음으로써 이것을 실험 할 수 있습니다. 즉 "b"속성 만 설정할 수 있지만 어디서나 가져올 수 있습니다.

1

수정자를 사용하면 파생 클래스가 선언 범위 내에서 멤버에 액세스 할 수 있습니다. 외부 세계 protected로 보호 된 키워드가 일하는 방법을 설명하고 내가 그것을 내가 생각하는 방법을 사용할 수없는 이유를 얘기하기 때문에

class a { 
    protected int steve {get;set} 
} 
class b : a { 
    void Example() { 
    steve = 42; // legal. Access protected within the declaration 
    } 
} 

class Program { 
    public static void Main() { 
    b local = new b(); 
    local.steve = 13; // Error! Outside b`s declaration steve is effectively private 
    } 
}