문제

이 질문은 이미 여기에 답이 있습니다.

다소 초보자 질문처럼 보일지 모르지만 왜 메소드 der.b ()가 기본 클래스 변수를 통해 보호 된 foo에 액세스 할 수없는 이유를 설명 할 수 있습니까? 이것은 나에게 이상하게 보인다 :

public class Base
{
    protected int Foo;
}

public class Der : Base
{
    private void B(Base b) { Foo = b.Foo; } // Error: Cannot access protected member

    private void D(Der d) { Foo = d.Foo; } // OK
}

감사!

도움이 되었습니까?

해결책

이것은 자주 묻는 질문입니다. 이것이 왜 불법인지 알아 내려면 무엇이 잘못 될 수 있는지 생각해보십시오.

기지에서 파생 된 다른 파생 클래스 FROB가 있다고 가정 해 봅시다. 이제 FROB의 인스턴스를 Der.B.에 전달합니다. Der.B에서 Frob.foo에 액세스 할 수 있어야합니까? 아니요. frob.foo는 보호됩니다. FROB의 FROB 및 서브 클래스에서만 액세스 할 수 있어야합니다. DER은 FROB가 아니며 FROB의 서브 클래스가 아니므로 Frob의 보호 회원에게 액세스 할 수 없습니다.

명확하지 않으면 주제에 관한 내 기사를 참조하십시오.

http://blogs.msdn.com/ericlippert/archive/2005/11/09/491031.aspx

다른 팁

B에서는 다른 클래스의 보호 된 구성원에게 액세스하려고합니다. 당신이 그 수업에서 물려 받고 있다는 사실은 관련이 없습니다. D에서는 현재 클래스의 기본 클래스의 보호 된 멤버에 액세스하고 있습니다. 이러한 맥락에서 DER 및 상속 된 유형의 보호 된 구성원의 모든 것에 액세스 할 수 있습니다.

기본 클래스에서 정적 메소드를 선언 하여이 한계를 해결할 수 있습니다.

public class Base
{
    protected int Foo;

    protected static int GetFoo(Base b)
    {
        return b.Foo;
    }
}

public class Der : Base
{
    private void B(Base b) { Foo = GetFoo(b); } // OK
}

간단히 말하면, 보호 된 것은 하위 클래스에 액세스 할 수 있습니다.

안에:

private void B(Base b) { Foo = b.Foo; }

DER 인스턴스에 액세스 할 수없는 보호 된 구성원에게 액세스하려고합니다. Der (this)의 현재 인스턴스의 기본 클래스 인 경우에만 액세스 할 수 있습니다.

private void D(Der d) { Foo = d.Foo; } // OK

기본 클래스 보호 방법에 액세스하기 위해 DER을 통과하기 때문에 잘 작동합니다.

시나리오에서 int foo에 "내부"를 사용하고 싶을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top