2010-11-29 7 views
2

post에 따르면 아래 코드는 컴파일해야하지만 그렇지 않은 경우 컴파일해야합니다.VB.NET에서 보호 된 멤버에 액세스

class Base 
    protected m_x as integer 
end class 

class Derived1 
    inherits Base 
    public sub Foo(other as Base) 
     other.m_x = 2 
    end sub 
end class 

class Derived2 
    inherits Base 
end class 

무엇이 문제입니까? 방금 새로운 VB.NET 콘솔 프로젝트를 만들고 코드를 복사하여 붙여 넣었습니다.

'SampleProject.Base.m_x'는 '보호됨'이며 다른 .NET Framework 버전 (2.0, 3.0 및 3.5)을 선택했기 때문에 'SampleProject.Base.m_x'에 액세스 할 수 없습니다.

+0

Foo()를 Base 클래스로 이동하십시오. –

답변

3

보호 된 멤버는 MyBase.m_x (C 번호에 기재)를 통해 도출 된 클래스로부터 만 접근 할 수있다. 당신은 쓸 수 :

public sub Foo(other as Base) 
    MyBase.m_x = 2 
end sub 

other 아니기 때문에,이다 컴파일되지 않는 이유 other.m_x = 2 이유 Derived1의 현재 인스턴스의 기본 클래스 인스턴스를 반환합니다. Base의 모든 인스턴스 일 수 있습니다. 이는 매개 변수 값이기 때문입니다.

2

당신은 변수, 기본 클래스의 예를에서 안 하나 상속에 액세스 할 수 있습니다.

class Base 
    protected m_x as integer 
end class 

class Derived1 
    inherits Base 
    public sub Foo(other as Base) 
     MyBase.m_x = 2 ' OK - Access inherited member 
     other.m_x = 2 ' NOT OK - attempt to access a protected field from another instance 
    end sub 
end class 
+0

기술적으로 올바르지 않습니다. 둘 다 유형 'Derived1'인 경우, 둘 다의 보호 된 구성원에 액세스 할 수 있습니다. 문제는 그가 '타당'하지 않은 기본 유형을 사용하고 있다는 것입니다 ('기타'는 'Derived1'과 관계가없는 'Derived42'와 같을 수 있기 때문입니다). –

+0

@Justin - 기본 클래스의 인스턴스에 대해 이야기하고 있음을 분명히했습니다. – Oded

0

보호 된 구성원의 중요한 측면은 상속 된 보호 된 구성원을 조상이 아닌 다른 클래스가 액세스하는 것을 효과적으로 차단할 수 있다는 것입니다. 클래스가 부모의 메서드/속성을 재정의하고 자식을 차단할 수 있으면 좋을 것입니다 클래스에 액세스 할 수 없지만 계층의 추가 레이어를 추가하지 않으면이를 수행 할 방법이 없다는 것을 알 수 있습니다. 예를 들어, 복제를 지원하지만, 클래스에 유용한 기본 클래스가 될 수있는 Protected "Clone"메소드가있는 클래스. 복제를 지원하지 않는 서브 클래스는 부모 Clone 메서드를 가리는 "Clone"이라는 더미 중첩 클래스를 만들어 자신의 하위 클래스에서 Clone을 호출하지 못하게 할 수 있습니다.

개체가 상속 체인의 다른 곳에 보호 된 멤버에 액세스 할 수있는 경우이 "보호 된"부분은 더 이상 적용되지 않습니다.

관련 문제