6

我有一堂课Server,它与 IRC 的服务器连接对话。它拥有一个已知Users 的列表,并根据需要创建它们。

我有两个涉及User课程的问题:

  1. 任何人都可以创建User. 我只希望Server班级能够做到这一点。
  2. 如果用户(事物User描述)更改了他/她的姓名(或其他信息,如加入的频道),则Server该类可以自行更改。但是,其他类也可以!我想禁止其他类接触此信息(使其只读)。

我该如何解决这两个问题?在 C++ 中,它可以通过使用friend关键字并使 ctor 和setName(等)私有来解决。

是否有一个 C# 关键字可以允许指定类访问某个方法?这将解决我的问题。

4

3 回答 3

8

老实说,我发现friend源自 C++ 的访问是糟糕设计的症状。你最好修复你的设计。

首先,谁真正关心是否有人创建了用户?真的有关系吗?我问这个是因为有时我们的程序员似乎会担心那些根本不会发生的事情,或者如果他们发生了,那也没关系。

如果您真的很在意,请执行以下操作之一:

  • 让用户成为一个界面。服务器可以实例化一个实现它的私有类;或者
  • 使 User 成为 Server 的内部类,没有公共构造函数,因此只有 Server 可以实例化它。

可见性 hack(C++ 中的朋友是其中之一,Java 中的包访问都是很好的例子)只是自找麻烦而不是一个好主意。

于 2009-02-15T03:54:37.657 回答
5

.NET 世界中最接近的friendinternal可见性。

请注意,如果您的两个类位于不同的程序集中,则可以使用InternalsVisibleTo属性来允许一个程序集对另一个程序集的内部进行可见性。

于 2009-02-15T03:42:48.450 回答
1

重新设计你的类层次结构可能是解决这个问题的一个公平的解决方案。因为在我看来,当它存在于 Server 类之外时,您真正需要的是一个只读的 User 类。

我可能会做这样的事情:

// 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 类暴露给外界。

于 2009-02-15T03:53:24.387 回答