6

別々のファイルに保存したい 2 つのクラスがあります。

namespace GridSystem
{
    public class Grid
    {
        public void AddItem(GridItem item)
        {
            item.InformAddedToGrid();
        }
    }
}

namespace GridSystem
{
    public class GridItem
    {
        public void InformAddedToGrid()
        {
            Debug.Log("I've been added to the grid");
        }
    }
}

他のクラスが InformAddedToGrid を呼び出せないようにするにはどうすればよいですか?

public、private、internal などの代わりに、メソッドで使用できる Actionscript 名前空間をエミュレートしようとしています。メソッドを正確に保護するわけではありませんが、メソッドを保護する前に名前空間を含める追加の手順を強制します。アクセスされます。C#でこれに代わるアプローチはありますか?

4

5 に答える 5

5

GridItem 自体も外界から隠すことができる場合は、GridItem をネストされたクラスとして Grid 内に配置することを検討します。そうすれば、クラスの外では見えません

http://www.codeproject.com/Articles/20628/A-Tutorial-on-Nested-Classes-in-C

于 2013-08-30T03:58:57.420 に答える
1

本当に醜い答えは、プライベートにしてリフレクションを使用することです。

別の醜い答えは、呼び出し元が間違っている場合に例外をスローすることです。

これらは両方とも、通常の呼び出しよりも実行がはるかに遅くなります。

良い答えはないと思います。C# には友達がいません。

于 2013-08-30T04:00:21.093 に答える
1

これを行うべきではありませんが、TGH が提案することを行い、GridItem のパブリック インターフェイスを用意し、gridItem を Grid にネストする必要があります (次に、Grid にファクトリ メソッドを作成してアイテムを作成し、部分的な Grid クラスを使用してそれらを別のファイルに格納する必要があります)。 .

フレンド メソッドを持つ方法がないため ( を通じてフレンド クラスを実行できますInternalsVisibleToAttribute) 。

あなたはこれを行うことができます(しかし、しないでください...)

public partial class Grid
{
   public void AddItem(GridItem item)
   {
      item.InformAddedToGrid();
   }
}        

public class GridItem
{
   public void InformAddedToGrid()
   {                
      if (new StackTrace().GetFrame(1).GetMethod().DeclaringType != 
                   typeof(Grid)) throw new Exception("Tantrum!");
      Console.WriteLine("Grid called in...");

   }
}

それから

 var g = new Grid();
 g.AddItem(new GridItem()); // works
 new GridItem().InformAddedToGrid(); // throws a tantrum...
于 2013-08-30T04:26:21.540 に答える
0

私見の答えは簡単です。アクセス修飾子は、クラスがどのようにパブリック/プライベートであるべきかという意図をプログラマーに思い出させるためのものです。反省することで、それらの障壁を取り除くことができます。

クラスの使用法はすべてあなたの手に委ねられています。クラスが1 か所でのみ使用されることを意図している場合は、そうしてください。どちらかといえば、クラスに特別な使用方法がある場合は、それを文書化して、XML コメントに入れてください。

とはいえ、この特定の例では、GridItemはグリッドに追加されないため、それについて通知するのはその仕事ではないと思います (「私がグリッドに追加されていない」場合はどうなるでしょうか?)。あなたのクラスのInformAddedToGridどこかにメソッドとして属していると思います。そこには、アイテムを追加するという概念があります...それが実際に行うことだと仮定します。GridprivateAddItem(GridItem)

于 2013-08-30T04:31:59.227 に答える