2016-03-10 140 views
2

嗨,我想有一個類不能實例化,但可以作爲靜態字段添加到另一個類,但我無法實現它;阻止類被實例化

這是我所做的;

public class ValueListManager 
    { 
     public static Operations myOps { get { return new Ops(); } }   
    } 

    public interface Operations 
    { 
     void Call(); 
    } 

    public class Ops : Operations 
    { 

     public void Call() 
     { 

     } 
    } 

我不想讓Ops類在其他地方實例化。基本上我想能夠;

ValueListManager.Operations.Call(); 

但我不希望能夠使用操作類像;

var ops = new Ops(); 

有沒有辦法做到這一點?

+0

好吧,它看起來像你想能夠在'ValueListManager'中調用一個無參數構造函數...所以你如何期望它與其他代碼不同? (例如,你可以給'Ops'一個私有構造函數,並使'ValueListManager'成爲一個嵌套類。) –

+0

@DavitTvildiani:不,OP希望能夠使用實例 - 只限制構造。 –

回答

6

你可以做到這一點通過聲明行動類作爲ValueListManager類中的私有類,你要使用它:

public class ValueListManager 
{ 
    private class Ops : Operations 
    { 
     public Ops() 
     { 
     } 

     public void Call() 
     { 
     } 
    } 

    public static Operations myOps { get { return new Ops(); } } 
} 

注意,在這個例子中根據你的代碼,一個新的實例每次訪問myOps屬性時都會創建Ops類。如果你不想這樣做,你需要將Ops實例存儲在靜態字段中,並在屬性的Getter中使用它。

4

據我所知,你想實例化這個類只有一次,並在以後使用它

您可以使用單選模式,您也可以使用繼承與此模式。

public class Ops: Operations 
{ 
    private static Ops instance; 

    private Ops() {} 

    public static Ops Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new Ops(); 
     } 
     return instance; 
     } 
    } 

public void Call() 
{ 
    // do something 
} 
} 

,並要使用它,你可以調用它的方法:

Ops.Instance.Call() 
+1

.Net 4或更高版本應該可以使用惰性加載的單例的懶惰,否則應該使用靜態字段初始值設定器。 [見John Skeets在這裏的文章](http://csharpindepth.com/Articles/General/Singleton.aspx) –

+0

@JamesBarrass我認爲只有在初始化需要資源的情況下:時間或內存或兩者,以避免資源消耗,直到這是需要的 –

+0

我的意思是一個線程安全無鎖的單行代碼在3行。替代方案是'私有靜態Ops實例=新Ops();' –

1

如果你不想你的窩班出於某種原因,並不願意從根本上改變什麼除了Ops類本身,你可以把你的代碼放到一個不同的組件(添加一個類庫解決方案),並構造internal

public class ValueListManager 
{ 
    public static Operations myOps { get { return new Ops(); } }   
} 

public class Ops : Operations 
{ 
    internal Ops() {} 
    public void Call() 
    { 
    } 
} 

ŧ如果你只需要添加一個你想使用的程序集的引用,你就不需要改變任何其他的代碼。

構造函數(因此new Ops())只能從該程序集中訪問,其他程序集中的代碼將不能使用new

1

這與設計模式singleton非常相似,但是如果您只想要一個實例或者您不想從其他位置實例化代碼,則不清楚您的代碼?

如果是你實現在C#中單最值得推薦的方法之後是一個實例是使用靜態構造函數:

public class Single 
{ 
    private static Single instance; 
    private Single() { } 

    static Single() 
    { 
     instance = new Single(); 
    } 

    public static Single Instance 
    { 
     get { return instance; } 
    } 
} 

大多數其他的方式有螺紋的(至少理論上的)風險的問題。

但是應該注意的是,在某些情況下,單例模式(通常廣泛使用靜態方法)表示設計不好。