给定包含原始数据集的 A 类和包含该数据的重新组织版本(GUI 就绪)的 B 类,我想让 A 中的原始数据在 B 中可见。
显然,A 类中的原始数据包含在私有成员中。我想通过使用类似于 C++ 朋友类方法的方法使该数据在 B 中可见。
我该如何处理?
谢谢你。
给定包含原始数据集的 A 类和包含该数据的重新组织版本(GUI 就绪)的 B 类,我想让 A 中的原始数据在 B 中可见。
显然,A 类中的原始数据包含在私有成员中。我想通过使用类似于 C++ 朋友类方法的方法使该数据在 B 中可见。
我该如何处理?
谢谢你。
严格来说,您不能定义可以向其公开数据的特定类(或类列表)。但是,您可以使用internal
访问修饰符代替private
,这使得成员可用于同一程序集中的任何类。
话虽如此,您应该强烈考虑通过属性而不是字段来公开这些成员(我猜这是您打算公开的)。这样做将允许该类准确定义如何将这些信息公开给其他类,以及当另一个类更改数据时应该发生什么——如果有的话。
可能这可能会帮助你..
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));
}
}
您可以在程序集中定义两者并将 A 中的字段标记为“内部”。
一种更面向对象的方法是在 A 中提供一组公共方法,允许访问数据(或数据的子集),通常通过简单的属性。
根据您的结构,您可以使用 Partial 类。这意味着 Data 和 UI 实际上都在同一个类中,但是您将它们放在不同的文件中。
如果这对您不起作用,那么您可以使用内部范围变量作为替代方案,或者使用 UI 以更通用的方式表示的数据集。
旧的方法(双关语)将定义简单的getvalue()和setvalue()函数来返回该值,以便在不使用这些函数的情况下无法访问这些值,在 C# 中,这些函数是称为属性的预定义成员。
class TestMethod{
private int Secret;
get { return Secret;}
set { Secret = value;}
}
另一种方法是,正如其他人在我之前所说的那样,只使用internal
修饰符。
另一种方法是沿着这些思路。请注意,这里的 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
{
}