题
我有课 Server
它与 IRC 的服务器连接进行对话。它包含一个已知的列表 User
s,并根据需要创建它们。
我有两个问题涉及 User
班级:
- 任何人都可以创建一个实例
User
. 。我只想要Server
类能够做到这一点。 - 如果一个用户(事物
User
描述)更改他/她的姓名(或其他信息,例如加入的频道),Server
类可以改变它本身。然而,其他课程也可以!我想禁止其他类接触此信息(使其只读)。
我该如何解决这两个问题?在C++中,可以通过使用 friend
关键字并使 ctor 和 setName
(等等)私人的。
C# 是否有一个关键字可以允许指定类访问某个方法?这可以解决我的问题。
解决方案
老实说我发现 friend
源自 C++ 的访问是不良设计的症状。你最好修复你的设计。
首先,谁真正关心是否有人创建了用户?真的有关系吗?我问这个问题是因为我们程序员有时会担心一些根本不会发生的事情,或者即使发生了也没关系。
如果您确实关心,请执行以下操作之一:
- 让用户成为一个界面。服务器可以实例化一个实现它的私有类;或者
- 让 User 成为 Server 的内部类,没有公共构造函数,这样只有 Server 可以实例化它。
可见性黑客(C++ 中的朋友就是其中之一,Java 中的包访问都是很好的例子)只是自找麻烦,而不是一个好主意。
其他提示
.NET 世界中最接近的 friend
是个 internal
能见度。
请注意,如果您的两个类位于不同的程序集中,您可以使用 内部可见 属性允许一个程序集看到另一个程序集的内部结构。
重新设计类层次结构可能是解决此问题的一个合理方法。因为在我看来,您真正需要的是一个只读的 User 类(当它存在于 Server 类之外时)。
我可能会做这样的事情:
// An abstract base class. This is what I'd use outside the
// Server class. It's abstract, so it can't be instantiated
// on its own, and it only has getters for the properties.
public abstract class User
{
protected User()
{
}
public string Name { get;}
// Other get-only properties
}
public class ServerUser : User
{
public ServerUser()
{
}
public string Name { get; set;}
// Other properties.
}
然后让 Server 类创建 ServerUser 类,使用 Server 类来更改 ServerUser 类上的属性(例如更改用户名),但仅向外界公开 User 类。
不隶属于 StackOverflow