4

あるクラスC1の一部(またはすべて)の関数に、別のクラスC2内からのみアクセスできるようにしたいことがよくあります。これは、C2が一種のプロキシであるため、タイプC1のオブジェクトを所有しているためです(例:「Neuron」クラスのメソッド、「 connect() "、「Brain」からのみアクセス可能である必要があります)。これは、「private」や「​​protected」などのキーワードで可視性を指定できる継承とは異なり、C#では直接不可能だと思います。

そのような状況でのベストプラクティスは何ですか?

4

4 に答える 4

5

クラスのアセンブリを作成し、外部に表示されるべきではない内部クラスを次のように宣言しますinternal

内部(C#リファレンス)

internalキーワードは、タイプおよびタイプメンバーのアクセス修飾子です。内部タイプまたはメンバーは、同じアセンブリ内のファイル内でのみアクセスできます

だから、このようなもの:

namespace YourAssembly.Classes
{
    internal class C1
    {
        public void Foo()
        {
        
        }
    }
    
    public class C2
    {
        public void DoFoo()
        {
            new C1().Foo();     
        }
    }
}

ここC2には他のアセンブリからC1アクセスできますが、同じアセンブリ内からのみアクセスできます。

于 2012-12-24T15:46:19.003 に答える
3

C1以外の人がアクセスできない場合は、のクラスをC2作成します。C1privateC2

public class C2
{
    public C2() { }

    private class C1
    {
        public C1() { }
    }
}

ただし、C1の外部からアクセスできる場合は、信頼できるプロキシであることを確認するために、のにC2何らかのパスを渡す必要があります。keyctorC2

public class C1
{
    public C1(string key)
    {
        // verify that it's a valid proxy or user of this class via the key
    }
}
于 2012-12-24T15:43:25.490 に答える
0

私の意見では、あなたにとって最善のことは次のようなことをすることです:

public interface INeuron 
{
   double GetValue();
   List<INeuron> GetDependents();
   List<double> GetWeights();
}

internal class Neuron : INeuron
{
   // implementation of INeuron
   // ...

   // implementation of methods only known to own classes
   public void Connect(Neuron target, double weight)
   {
      ...
   }
}

public class Brain
{
   private List<Neuron> _allNeurons = new List<Neuron>();       

   public Brain()
   {
      Neuron n1 = new Neuron();
      Neuron n2 = new Neuron();
      n1.Connect(n2,0.5);
      _allNeurons.Add(n1);
      _allNeurons.Add(n2);
   }

   public IEnumerable<INeuron> GetAllNeurons() { return _allNeurons.Cast<INeuron>(); }
}
于 2012-12-24T16:14:22.700 に答える
0

テスト目的でよく使用されるトリックは、InternalsVisibleToAttributeを使用することです。このようにアセンブリ(exeまたはdll)に適用します

[assembly: InternalsVisibleTo("NameOfFriendAssembly")]

として定義されたクラス (およびその他の型) およびメンバーinternalは、原因の内部だけでなく、アセンブリにも表示されます。NameOfFriendAssembly

于 2012-12-24T15:50:10.703 に答える