2012-01-24 16 views
4

私はベース(抽象)クラスComponentを持っています。私は誰もが読み取りアクセスを取得するような派生クラスのプロパティへのアクセスを制御したいが、書き込みアクセスは特定のクラスでのみ許可されています。異なるクラスのプロパティへのアクセスが異なる

これらの「特定のクラス」は、現在、抽象基本クラスMessageHandler<TMessage>を実装するものです。理想的には、IMessageHandlerを実装するクラスもアクセスできるようにしたいと思っていますが、それは要件が少し難しくなると思います。

これはxbox上で実行されるので、一時的なオブジェクト(読み取り専用コピーなど)を作成しないようにします。私はまた、読み込み/書き込みの値を取得するメソッド呼び出しの数を最小限にしたい。

ComponentクラスとMessageHandler<TMessage>クラスは現在独自のアセンブリに属しています。これらのクラスはいずれも、自分のAPIを使用するときに他のプロジェクトによって参照されます。

私は何とか私のモデルを変更しなければならないと思っていますが、私はそれの周りに頭を上げることはできません。

public abstract class Component 
{ 

} 

public class DerivedComponentA : Component 
{ 
    int property {get; set;} 
} 

public abstract class MessageHandler<TMessage> 
{ 

} 

public class IntMsghandler : MessageHandler<int> 
{ 
    void DoThing(DerivedComponentA derivedComponentA) 
    { 
     derivedComponentA.property = 5; // Allowed 
    } 
} 

public class AnyClass // Doesn't inherit MessageHandler, or implement IMessageHandler 
{ 
    void DoThing(DerivedComponentA derivedComponentA) 
    { 
     derivedComponentA.property = 5; // Not Allowed 
    } 
} 
+0

不明な点がある場合はお知らせください。編集します。 –

+0

あなたがアクセスを制限したいのは明確ではありません。アクセスを制限したいプロパティはどこにありますか? –

+2

@Matten:それは違法です。オーバーライドされたメンバーのアクセス修飾子は変更できません。 –

答えて

1

(あなたが作った質問に基づいており、私は理解し)、分離ベースクラスの定義に基づいて行われる(もしあれば)。つまり、隔離を意味するから始まるはずです。

class Xが実装されている場合、MessageHandlerは、class Yタイプのオブジェクトでいくつかの方法で動作する必要があります。これは、 class YMessageHandlerの間に厳しい関係があることを意味します。

これは、あなたがこのようsomehtingを行うことができますことを私に考えるようにつながる:MessageHandlerDerivedComponentA

  • の性質上

    • のみ公共getが反射して、一般的なprotected SetProperty(Component compo, string propertyName, object propertyValue)とセットに必要なプロパティを定義します。 任意のComponent派生クラスのプロパティを設定するには、このようにして

    唯一可能な方法はMessageHandlerメソッドを使用しているので、それだけから派生したものもののために利用できるようになります。残りのタイプの場合は、public get(読み取り専用)のデータ読み取り用のプロパティを指定します。

    これが役に立ちます。

  • 0

    あなただけのこのようセッターを制御することはできません:

    public string Prop { 
        get { return ...; } 
        set { if (!(this is MessageHandler<TMessage>)) 
          throw Exception(...); 
         .... setter code; 
        } 
    } 
    
    +0

    申し訳ありませんが、私はおそらく明確ではない、プロパティはコンポーネントクラスではなく、メッセージハンドラ(メッセージハンドラは値を変更したいものです)です。コードが追加されました。 –

    +0

    また、理想的には、コンパイル時に強制したい(現実的なことはわかりませんが)。 –

    1

    私はここのインターフェイスで作業示唆しています。読み込み専用のプロパティを持つIReadOnlyComponentの1つの読み取り専用インターフェイスと、プロパティのSetメソッドを追加するIWritableComponent : IReadOnlyComponentがあります。
    抽象基本クラスComponentIWritableComponentを実装しているため、読み取り専用プロパティとSetメソッドがあります。
    コンポーネントインスタンスをIWritableComponentとして、MessageHandlerを継承するクラスに渡すか、IMessageHandlerを実装し、他のすべてのクラスにIReadOnlyComponentとして渡します。

    関連する問題