29

あるクラスの特定のメソッドに、特定のクラスだけがアクセスできるようにしたい。例えば:

public class A
{
  public void LimitedAccess() {}
  public void FullAccess() {}
}

public class B
{
  public void Func()
  {
     A a = new A();
     a.LimitedAccess();       // want to be able to call this only from class B
  }
} 

public class C
{
  public void Func()
  {
     A a = new A();
     a.FullAccess();           // want to be able to call this method
     a.LimitedAccess();        // but want this to fail compile
  }
} 

これを強制するために使用できるキーワードまたは属性はありますか?

アップデート:

既存のシステムの複雑さと時間の制約により、影響の少ないソリューションが必要でした。そして、コンパイル時に LimitedAccess() を使用できないことを示す何かが必要でした。Jon Skeet の答えは、まさに私が求めていたことは C# では実行できないというものでした。

質問とジョンの答えは、後でこれに出くわす可能性のある人にとっては良いことです. そして、このデザインのにおいがするという事実は、このようなものを望ましい解決策として選択する人を遠ざけることができれば幸いです.

コメントで述べたように、C# フレンドの会話は、同様の状況を解決しようとしている場合に役立ちます。

私の特定の解決策については、「なぜAにBのロジックが含まれるのですか」(コメントで@sysexpandから尋ねられました)。それがこすりです。 B.Func()私が取り組んでいるシステム全体で呼び出されましたが、主に のシングルトンで動作しましたA。それで私がやったBのは、に移動Func()AA.LimitedAccess()非公開にすることでした。いつものように、他にも回避すべき詳細がいくつかありましたが、への呼び出し元でコンパイル時エラーが発生する影響の少ない解決策が得られましたA.LimitedAccess()

議論していただきありがとうございます。

4

7 に答える 7

25

いいえ。できることはLimitedAccess、プライベート メソッドを作成し、 classB内にクラスをネストすることだけですA

(すべてのクラスを同じアセンブリに入れたいと仮定しています。それ以外の場合は、 and を同じアセンブリに入れABCのアセンブリに入れLimitedAccessinternalメソッドを作成できます。)

于 2013-05-15T18:56:34.890 に答える