2012-01-19 4 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を返し継承クラスにプライベートメソッドを追加することで、より良い解決策はありますか?

+0

どこからアクセスしようとしていますか、最初にそのプロパティを隠したのはなぜですか? –

+0

入れ子になったクラスのメソッドからアクセスしようとしています。新しいプロパティは基本プロパティより多くの機能を提供するので、私は基本プロパティを隠しました。私は2つのプロパティを持つことを望んでいません。 – 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'タイプの修飾子で保護されたメンバ 'member'にアクセスできません。修飾子は 'type2'型でなければなりません(またはそれから派生しています)http://msdn.microsoft.com/en-us/library/s9zta243.aspx – Giorgi

関連する問題