我有一个类(基本上是一个链表,所以我们称它为 List
),它使用另一个类来存储数据(节点,所以我们称该类为 Node
). Node
具有必须从 List
调用的方法,但从其他地方调用它们可能会很麻烦。我需要程序的其他部分使用 Node
的引用,但只能通过 List
更改它们。
在 C++ 中,我会创建另一个类(我们称它为 Opaque
),它有一个指向 Node
的私有(private)指针并公开 Node
的一些成员,如果这被传递给 List
,指向实际 Node
的指针将被“解包”并在内部使用,但在 C# 中我还没有想到隐藏对的引用的方法Node
来自程序的其余部分,而不会使 List
无法访问它。
有什么方法可以做到这一点,或者有一些具有相同功能的特定于 C# 的习惯用法吗?
澄清:我想让它只对 List
类可见。我已经知道 internal
关键字。
最佳答案
怎么样
public interface INode
{
string Name { get; }
}
public class List
{
private class Node : INode
{
public string Name { get; set; }
public Node Next { get; set; }
}
private List<Node> _items = new List<Node>();
public INode GetItemAt(int index)
{
return _items[index];
}
public INode GetNextItem(INode item)
{
return (item is Node) ? ((Node)item).Next : null;
}
}
只有 INode
公开可见,实现细节隐藏。
如果有很多内部代码与 Node
一起工作,那么最好将类标记为 internal
,正如 @eugene-podskal 所建议的那样Node
类将可供生活在同一个原始程序集中的许多“ friend ”访问(有关此可访问性模型的更详细描述,请参阅 MSDN: internal (C# reference))
internal
概念本身并没有错(由@dasblinkenlight 提出并提出异议)。它也经常被 .NET 框架使用,参见 http://referencesource.microsoft.com/#q=internal示例或各种 .NET 框架内部类。可以使用 ILSpy 查看整个内部 .NET 框架 namespace 的示例。例如在命名空间 Microsoft.Win32.SafeHandles
system.dll
关于c# - 在 C# 中创建不透明指针(引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25950670/