2014-02-11 62 views
1

我有一個小問題。我在多個應用程序使用的框架中有一個應用程序監視部分。數據結構表示可擴展和唯一的值

現在我有一個功能是這樣的:

public enum Vars 
{ 
    CPU, 
    RAM 
} 

public void Add(Vars variable, object value) 
{ 
    [...] 
} 

這是在Add方法作爲參數變量將被用作數據庫的條目的名稱。 現在我得到了要求,應用程序可以在框架外指定自己的變量。因爲你不能從一個枚舉繼承,這會導致一些麻煩。

爲了解決這個問題,我基本上看到了2種可能性(這在我看來並不令人滿意)。

可能性1:

public void Add(enum variable, object value) 

此方法將接受各種枚舉的,因此用戶可以使用瓦爾枚舉,以及他們已經被定義自理枚舉。此解決方案的問題:用戶可能會在..應用程序和框架中使用相同的名稱。我無法區分兩個枚舉值「CPU」(框架可能會將百分比值存儲爲「CPU」,應用程序可能會將進程cpu使用情況存儲爲「CPU」)。

可能性2:

第二種方法將是一個類而不是一個枚舉,類似:

public class Vars 
{ 
    public const string CPU = "CPU"; 
    public const string RAM = "RAM"; 
} 

這裏的缺點: 1.多寫。 2.我必須定義參數字符串:

public void Add(string variable, object value); 

這可能會導致missuse以及(其中添加字符串,而不是直接確定從瓦爾繼承的類應用程序)。

如何定義其中模型任何想法:

  • 可以繼承(以延長由應用程序特定值的值)
  • 可作爲一個參數
  • 保證,不存在任何雙(=相同的值)條目 ?
+0

閱讀http://stackoverflow.com/questions/9232488/emulate-enum-inheritance-best-choice-practices –

回答

3

的背景是不完全清楚,但對於創建一個類

public class Vars 
{ 
    public static Vars CPU = Vars.Get("CPU", 1); 
    public static Vars RAM = Vars.Get("RAM", 2); 

    //You can keep one of the params, name or id 
    private Vars(string name, int id) 
    { 
     ... 
    } 

    public static Vars Get(string name, int id) 
    { 
     //check if id or name exists in static dictionary, and return that instance or create new one 
    } 
} 


public void Add(Vars variable, object value); 

現在,用戶可以創建任何類型的參數,並傳遞給方法,

Vars newVar = Vars.Get("MyNewParam", 10); 

您可以輕鬆地檢查傳遞的參數是否爲1,你知道的關於

如果參數相同,Get方法返回相同的實例

+0

您還可以通過在構造函數中添加對唯一性的檢查來改進此片段。添加一個靜態'HashMap '並在那裏添加所有'name'值。如果值已經存在,則可以拋出異常。 – Impworks

+0

@Impworks,我注意到,後和已編輯,謝謝:) –

+0

這是一個很好的解決方案,謝謝! –