1

クラス A が 1 つあり、そこからクラス B の保護されたメンバーにアクセスする必要があります。これは、C++ で friend キーワードを使用するのと同じ方法です。ただし、内部修飾子は私のニーズには合いません。クラス B は、クラス A のインスタンスを作成し、そのプライベート データを変更して、そのクラスへの参照を返す必要があります。これらのクラス A メンバーは、元の呼び出し元に対して非公開のままにする必要があります。

public class A
{
    protected int x;
}

public class B
{
    public static A CreateClassA()
    {
        A x = new A();
        x.x = 5;   // ERROR : No privilege
        return x;
    }
}
4

7 に答える 7

5

同じアセンブリ内のすべてのクラス、および他のアセンブリ内のサブクラスへのアクセスを許可するprotected internal代わりに、を使用できます。internal

public class A
{
    protected internal int x;
}

public class B
{
    public static A CreateClassA()
    {
        A x = new A();
        x.x = 5;   // hurray
        return x;
    }
}
于 2014-03-26T11:07:37.730 に答える
5

この時点での質問は少し古いですが、講義や指を振ることなく、あなたが求めていることを行う別の方法を次に示します。

検討:

A foo = new A();
FieldInfo privateField = foo.GetType().GetField("x", BindingFlags.NonPublic | BindingFlags.Instance);
privateField.SetValue(foo, 5);

警告: 上記のコードを使用すると、カプセル化が壊れ、背骨が曲がり、OO 純粋主義者の甲高い叫び声によって耳が損傷する可能性があります。

...しかし、ファクトリ クラスではうまく機能し、C# のフレンド キーワードの欠如を補います。

警告 2: これは遅いです。

于 2013-12-23T16:06:05.987 に答える
3

公式の MSDN Friend Assembly を確認してください。 http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx その例では、次のことができます。

using System.Runtime.CompilerServices;
using System;

[assembly: InternalsVisibleTo("AssemblyB")]
public sealed class A
{
    internal int x;
}

そして、アセンブリ B から内部メソッド/フィールドを設定/呼び出します。

于 2012-04-29T19:49:47.190 に答える
3

protectedフィールドのパブリック セッターを作成するか、クラスから継承する必要があります。

public class A
{
    protected int x;

    public int X { set { x = value; }  }
}

public static A CreateClassA()
{
    A x = new A();
    x.X = 5;
    return x;
}

または:

public class B : A
{
    public static A CreateClassA()
    {
        this.x = 5; 
        return x;
    }
}
于 2012-04-29T19:12:17.913 に答える
1

これを試して:

   public class A
   {
      protected int x;

      public class B
      {
          public static A CreateClassA()
          {
              A x = new A();
              x.x = 5;   // ERROR : No privilege
              return x;
          }
      }
   }
于 2012-04-29T19:13:31.037 に答える
0

他の選択肢:

public class A
{
    public A() { }

    public A(int x)
    {
        this.x = x;
    }

    protected int x;
}

public class B
{
    public static A CreateClassA()
    {
        A x = new A(5);
        return x;
    }
}
于 2012-04-29T19:23:19.670 に答える
0

A から継承する場合は、保護されたメンバーにのみアクセスできます。次のいずれかを実行できるようになりました。

  • A から継承
  • X の値を設定する public メソッド setX(int newX) を作成します。
于 2012-04-29T19:11:53.550 に答える