使方法/属性对一个类可见,对其他类隐藏

时间:2009-02-15 03:39:33

标签: c# encapsulation

我有一个类Server,它与IRC的服务器连接进行通信。它包含已知User的列表,并根据需要创建它们。

我有两个涉及User类的问题:

  1. 任何人都可以创建User的实例。我只希望Server类能够这样做。
  2. 如果用户(事物User描述)更改了他/她的名字(或其他信息,如加入的频道),Server类可以自行更改。但是,其他课程也可以!我想禁止其他类接触这些信息(使其只读给他们)。
  3. 我如何解决这两个问题?在C ++中,可以使用friend关键字并将ctor和setName(等)设为私有来解决。

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

3 个答案:

答案 0 :(得分:8)

老实说,我发现源自C ++的friend访问权限是恶意设计的症状。你最好修理你的设计。

首先,谁真的关心是否有人创建用户?真的有关系吗?我问这个问题是因为看起来有时我们的程序员会担心那些根本不会发生的事情,或者如果他们这样做,那就无所谓了。

如果您真的关心,请执行以下操作之一:

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

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

答案 1 :(得分:5)

.NET世界中距离friend最近的是internal可见性。

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

答案 2 :(得分:1)

重新设计类层次结构可能是解决此问题的公平解决方案。因为它听起来像你真正需要的只是一个只读的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类暴露给外部世界。