12

生データのセットを含むクラスAと、そのデータの再編成されたバージョン(GUI対応)を含むクラスBがある場合、Aの生データをBで表示したいと思います。

明らかに、クラスAの生データはプライベートメンバーに含まれています。C ++のフレンドクラスメソッドに似たものを使用して、そのデータをBで表示できるようにしたいと思います。

どうすればこれにアプローチできますか?

ありがとうございました。

4

6 に答える 6

9

厳密に言えば、データを公開できる特定のクラス(またはクラスのリスト)を定義することはできません。ただし、のinternal代わりにアクセス修飾子を使用できprivateます。これにより、同じアセンブリ内のすべてのクラスでメンバーを使用できるようになります。

そうは言っても、フィールドではなくプロパティを介してこれらのメンバーを公開することを強く検討する必要があります(これは、公開を計画していると私が推測していることです)。これを行うことで、クラスは、その情報を他のクラスに公開する方法と、別のクラスがデータを変更したときに何が起こるかを正確に定義できます。

于 2010-02-01T16:39:44.687 に答える
6

これはあなたを助けるかもしれません。

public class A
{
    public A() { }

    public string AccessData(object accessor)
    {
        if (accessor is B)
            return "private_data";
        else
            throw new UnauthorizedAccessException();
    }
}

public class B
{
    public B() { }

    private void AccessDataFromA()
    {
        Console.WriteLine(new A().AccessData(this));
    }
}
于 2010-03-16T04:54:13.677 に答える
1

アセンブリで両方を定義し、Aのフィールドを「内部」としてマークすることができます。

よりオブジェクト指向のアプローチは、通常は単純なプロパティを介して、データ(またはデータのサブセット)へのアクセスを可能にする一連のパブリックメソッドをAに提供することです。

于 2010-02-01T16:40:45.603 に答える
0

構造によっては、Partialクラスを使用できる場合があります。これは、データとUIが実際には両方とも同じクラス内にあるが、異なるファイル内にあることを意味します。

それがうまくいかない場合は、代わりに内部スコープ変数を使用するか、UIがより一般的な方法で表すデータセットを操作します。

于 2010-02-01T16:53:04.513 に答える
0

古いメソッド(しゃれを意図した)は、単純なgetvalue( )関数とsetvalue()関数を定義してその値を返すことで、これらの関数を使用しないとこれらの値にアクセスできなくなります。C#では、これらの関数はプロパティと呼ばれる事前定義されたメンバーです。

class TestMethod{ 
private int Secret;

get { return Secret;}
set { Secret = value;}
}

もう1つの方法は、他の人が私の前に述べたように、internal修飾子を使用することです。

于 2010-03-16T04:41:21.757 に答える
0

別のアプローチは、これらの線に沿ったものです。ここでのgetterとsetterは、クラスBをキーとして指定しているため、他のクラスがクラスAの内部状態に到達できないことに注意してください。

public class Program
{
    public static void Main()
    {
         var a = new A(29);
         var (getter, setter) = A.GetAndSetOnlyForB(a);
    
         Console.WriteLine(getter(new B())); // 29
         setter(new B(), 2);
         Console.WriteLine(getter(new B())); // 2

         getter(new C()); // compile error, cannot do that
         setter(new C(), 9); // compile error, cannot do that
    }
}

sealed class A
{
    private int _hiddenInt;
    public A(int hiddenInt)
    {
        _hiddenInt = hiddenInt;
    }
    
    public static (Func<B, int>, Action<B, int>) GetAndSetOnlyForB(A obj)
    {
        return ((key) => obj._hiddenInt, (key, arg) => { obj._hiddenInt = arg; });
    }
}

sealed class B
{
}

sealed class C
{
}

于 2021-09-27T14:31:04.073 に答える