2009-02-15 24 views
6

我有一個類Server,它與IRC的服務器連接進行通信。它包含已知User的列表,並根據需要創建它們。使方法/屬性對一個類可見,對其他人隱藏

我有涉及User類兩個問題:

  1. 任何人都可以創建一個User的一個實例。我只想要Server類能夠做到這一點。
  2. 如果用戶(東西User描述)更改其名稱(或其他信息,如加入的渠道),Server類可以自己更改它。但是,其他類也可以!我想禁止其他班級接觸這些信息(使其只讀)。

我該如何解決這兩個問題?在C++中,它可以通過使用關鍵字並使ctor和setName(以及此類)保密來解決。

是否有一個C#關鍵字可以允許某個方法可以被指定的類訪問?這將解決我的問題。

回答

8

老實說,我發現源於C++的friend訪問是壞設計的症狀。你最好修復你的設計。

首先,誰真的關心有人創建用戶?真的有關係嗎?我這樣問,因爲看起來有時我們程序員會陷入擔心,那些根本不會發生的事情,或者如果他們這樣做,那並不重要。

如果你真的關心然後執行下列操作之一:

  • 製作用戶界面。服務器可以實例化一個實現它的私有類;或
  • 使用戶成爲不帶公共構造函數的服務器的內部類,因此只有服務器可以實例化它。

能見度黑客(其朋友在C++是一個和Java包的訪問都是很好的例子)只是自尋煩惱,而不是一個好主意。

+0

我用你提出的兩種方法去了。我創建了一個接口IUser和一個ServerUser內部類。 (我也將服務器分成兩個類,以便其他人可以編寫他們自定義的IRC客戶端。)感謝您的回答! – strager 2009-02-18 00:52:30

5

在.NET世界中最接近friend的是internal知名度。

請注意,如果您的兩個類位於單獨的程序集中,則可以使用InternalsVisibleTo屬性來允許一個程序集的其他內部可見性。

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. 
} 

然後讓服務器類創建ServerUser類,用戶的服務器級別的改變對ServerUser類的屬性(如更改用戶名),但只有暴露用戶類外面的世界。

相關問題