1

この質問が以前に解決されている場合は、事前に申し訳ありません。

私は C# で小さなライブラリを作成しており、クラス A がクラス B のデータ メンバーを変更できるようにしたいと考えています。クラス A と B は同じ名前空間に存在します。名前空間 C の E は、B のデータ メンバーにアクセスできません。

名前空間 CD
{
    クラスB
    {
        修飾子 int
            、
            b;

        パブリック B()
        {
        }
    }

    クラスA
    {
        パブリック A() {}

        public B DoStuff()
        {
            B b = 新しい B();
            バ= 1; bb = 2;
            bを返します。
        }
    }
}

名前空間 C
{
    クラスE
    {
        static void Main(String[] args)
        {
            A a = 新しい A();
            B b = a.DoStuff();
        }
    }
}

上記のメイン メソッドでは、名前空間 CD 内のすべてのクラスがクラス B オブジェクトのデータ メンバーを変更できるようにしたいと考えていますが、CD 名前空間の外部ではクラス B オブジェクトのデータ メンバーを変更することはできません。

名前空間の構造や修飾子を変更したり、特定のデザイン パターンを実装したりすることで、これを行う方法はありますか?

よろしくお願いします。: )

4

2 に答える 2

2

CD 内の関連するクラスを別のアセンブリに移動する場合は、「内部」アクセス修飾子を使用できます。

namespace C.D
{
    class B
    {
        internal int a;
        internal int b;

        public B()
        {
        }
    }
}
于 2012-08-29T18:34:17.433 に答える
0

これを達成する 1 つの方法は次のとおりです。

  1. クラス A の定義をクラス B に移動する ( 内にネストするclass B { ... })

  2. クラス B のフィールド (aおよびb)を作成しprivateます。

すなわち

名前空間 CD
{
    クラスB
    {
        プライベート int a、b。

        パブリック B()
        {
        }

        クラスA
        {
            パブリック A() { }

            public B DoStuff()
            {
                B b = 新しい B();
                バ= 1; bb = 2;
                bを返します。
            }
        }
    }
}

名前空間 C
{
    クラスE
    {
        static void Main(String[] args)
        {
            A a = 新しい A();
            B b = a.DoStuff();
        }
    }
}

これを実現する別の方法は、クラス B のフィールドを作成し、クラス B のフィールドprotectedにアクセスできるすべてのクラスをクラス B から派生させることです。この方法では、クラス A をクラス B 内にネストする必要はありません。つまり、

名前空間 CD
{
    クラスB
    {
        保護された int a、b;

        パブリック B()
        {
        }
    }

    クラスA:B
    {
        パブリック A() {}

        public B DoStuff()
        {
            B b = 新しい B();
            バ= 1; bb = 2;
            bを返します。
        }
    }
}

名前空間 C
{
    クラスE
    {
        static void Main(String[] args)
        {
            A a = 新しい A();
            B b = a.DoStuff();
        }
    }
}
于 2012-08-29T18:37:40.497 に答える