2012-01-19 2 views
2

이 클래스 내에 기본 속성과 중첩 클래스를 숨기는 속성이있는 클래스가 있다고 가정 해 보겠습니다. 베이스에 액세스 할 수 있습니까 숨김 * 가상 * 중첩 클래스의 속성입니까?중첩 클래스의 외부 클래스 숨겨진 기본 속성에 액세스

class BaseClass 
{ 
    protected virtual String SomeProperty {get; set;} 
} 

class Inherited : BaseClass 
{ 
    protected new String SomeProperty {get; set;} 

    class Nested 
    { 
     Inherited parent; 
     public Nested(Inherited parent) 
     { 
      this.parent = parent; 
     } 

     public void SomeMethod() 
     { 
      //How do I access the SomeProperty which belongs to the BaseClass? 
     } 
    } 
} 

내가 생각할 수있는 유일한 해결책은 더 나은 솔루션이 있습니까 base.SomeProperty을 반환 상속 클래스에 private 메소드를 추가하는 것입니다 : 여기

은 예입니다?

+0

어디에서 액세스하려고합니까? 왜 처음에 속성을 숨겼습니까? –

+0

중첩 클래스의 메서드에서 액세스하려고합니다. 새 속성이 기본 속성보다 많은 기능을 제공하고 두 가지 속성을 갖고 싶지 않기 때문에 기본 속성을 숨 겼습니다. – Giorgi

답변

5

InheritedClass 참조를 BaseClass으로 전송할 수 있습니다. 기본 속성을 재정의하는 대신 숨기기 때문에 트릭을 수행해야합니다.

public void SomeMethod() 
{ 
    BaseClass baseRef = parent; 
    // do stuff with the base property: 
    baseRef.SomeProperty = someValue; 
} 

편집 :

가이 작업을하려면 BaseClassSomeProperty 속성은 중첩 된 클래스, 중함으로써 액세스 할 수 있습니다 그것을 internal (당신은을하지 않으려면 다른 어셈블리의 파생 클래스에서 재정의 할 수 있도록하려는 경우 protected internal).

두 옵션이 모두 사용할 수있는 범위를 벗어난 경우 (즉, 파생 클래스가 이미 다른 어셈블리에있는 경우) 래퍼 속성을 선언 할 필요가 없습니다.

private string SomeBaseProperty 
{ 
    get 
    { 
     return base.SomeProperty; 
    } 

    set 
    { 
     base.SomeProperty = value; 
    } 
} 
+0

답변을 주셔서 감사합니다. 부동산이 실제로 가상 인 것을 잊었습니다. 나는 내 질문을 업데이트했다. – Giorgi

+0

여전히 섀도 잉을 사용하는 한 내 솔루션이 작동합니다.) – Nuffin

+2

이로 인해 컴파일러 오류가 발생합니다. CS1540 : 'type1'유형의 한정자를 통해 보호 된 멤버 '멤버'에 액세스 할 수 없습니다. 한정자는 'type2'유형이어야합니다 (또는 파생 됨). http://msdn.microsoft.com/en-us/library/s9zta243.aspx – Giorgi