0

少し奇妙に聞こえるかもしれませんが、説明しようと思います。多くのプロパティを持つクラスがあり、それらはすべて読み取り専用であり、そのプロパティを変更できるのはこのクラスだけだとします (イベントをリッスンし、そのイベントに含まれる情報をプロパティに入力します)。

しかし、いくつかの構造体のいくつかのプロパティをカプセル化して、適切に編成された階層を作成したいので、所有者クラスを除いて、これらの構造体のプロパティも読み取り専用にする必要があります。例えば:

public class A
{
    private int a1;
    public int A1 
    { 
        get{ return a1; } 
    }

    private B structB;
    public B StructB
    {
        get{ return structB; }
    }

    private method eventListenerMethod(...)
    {
        a1 = someValue;
        structB.B1 = otherValue; //I want that only this class can modify this property!
    }
}

public struct B
{
    private int b1;
    public int B1
    {
        get{ return b1; } // This property should be modifiable for Class A!!
    }
}

私はそれができないと思いますが、どうすればそれを達成できるか知っている人はいますか? 事前にどうもありがとうございました。

4

2 に答える 2

1

あなたが求めているのは、C++ の「friend」キーワードです。ただし、C# には存在しませんが、「内部」は適切な妥協点です。したがって、アセンブリ内でのみアクセスできる「内部セット」プロパティを作成するだけです。したがって、アセンブリを使用する他の人はアクセスできません

于 2012-09-20T09:43:34.887 に答える
0

structを aに変更してclass作成しますprivateが、その定義を の中に入れます class A

これはclass A、そのプロパティにのみアクセスできることを意味します。内部のすべてのプロパティをclass Bpublic にすることができます (プロパティが定義されているクラスだけがアクセスできるため)。

これはclass Bプライベートであるため、コンパイラ エラーが発生しますが、パブリック プロパティで公開されます。これを修正するには、タイプとして公開するパブリック インターフェイスを作成しIClassB(悪い名前ですが、アイデアは得られます)、プロパティ タイプをインターフェイスに変更します。このインターフェイスには、プロパティ メソッド シグネチャの get アクセサーのみがあることを確認してください。

このようなものが動作するはずです:

public class A : IClassB
{
   public IClassB B { get; }

   private class B : IClassB
   {
       public int B1 { get; }
   }
}

public interface IClassB
{
   int B1 { get; }
}
于 2012-09-20T09:47:39.940 に答える