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 类。这意味着 Data 和 UI 实际上都在同一个类中,但是您将它们放在不同的文件中。

如果这对您不起作用,那么您可以使用内部范围变量作为替代方案,或者使用 UI 以更通用的方式表示的数据集。

于 2010-02-01T16:53:04.513 回答
0

旧的方法(双关语)将定义简单的getvalue()setvalue()函数来返回该值,以便在不使用这些函数的情况下无法访问这些值,在 C# 中,这些函数是称为属性的预定义成员。

class TestMethod{ 
private int Secret;

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

另一种方法是,正如其他人在我之前所说的那样,只使用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 回答