2011-07-30 8 views
10

「設定されたアクセサーのアクセシビリティー修飾子は、プロパティーまたはインデクサーよりも制限が厳しくなければなりません」というエラーがあります。私は解決策も知っています。この非常に特殊なケースではない。C# - この例のプロパティのカプセル化を改善しますか?

は、この例を考えてみましょう:

internal virtual bool IsFocused 
    { 
     get 
     { 
      return isFocused; 
     } 
     protected set 
     { 
      isFocused = value; 
     } 
    } 
    private bool isFocused; 

それはエラーを示しています。私は理由を知らない。内部よりも「保護された」アクセス方法はいかがですか?この問題の解決策は何でしょうか?私は代わりに運がない "内部保護"を入れてみました。

答えて

6

結局のところ、protectedinternalよりよりアクセス可能です。 internalInternalsVisibleToアクセスを除いてinternalpublicのように見えることを除いて、このアセンブリの外側には見えないことを意味します。protectedはすべてのサブクラスに見えることを意味します。 internalはしていませんが

+0

解決策は何ですか? –

+1

解決策は、最初に達成しようとしていたものに依存します。あなたは本当にこのプロパティが社内である必要がありますか?おそらく、あなたは単一のクラス/インターフェースに多すぎる責任を抱いています。たぶん、あなたはトップレベルのクラスを公開しながら、内部のサーフェス領域をスコープして別の完全内部クラスに入れることができます。 – bobbymcr

5

@bobbymcrが彼の分析に完全に右である参照してください。解決策は、プロパティをinternal protectedとマークすることです。 C#では、現在のアセンブリのすべてのクラスに対して派生クラスおよびの両方にアクセスできることを意味します。

アクセサーメソッドにinternal protectedを付けると、それは派生クラスからアクセス可能であることを意味します。しかし、プロパティ全体はそうではなく、エラーが発生します。プロパティ全体をinternal protected、アクセサーメソッドをprotectedとマークすると、すべて問題ありません。

internal protected virtual bool IsFocused 
{ 
    get 
    { 
     return isFocused; 
    } 
    protected set 
    { 
     isFocused = value; 
    } 
} 
private bool isFocused; 

その他のオプションは、セッターで呼び出されるprotectedメソッドを導入することです。次に、プロパティ全体をinternalとマークし、そのメソッドだけをオーバーライドすることができます。

関連する問題