2011-12-14 62 views
0

我最近完成了計算機圖形類的分子/蛋白質查看器的工作。原子顯然是這樣一個計劃的一個非常重要的部分。目前,我有一個包含每個元素(氫,氦等)的大枚舉。每個元素都有相關的信息,如顏色,半徑等我使用的是擴展類,所以我可以這樣寫:正確的大型枚舉設計

float r = Element.Neon.Radius(); 

我還需要能夠得到相應的枚舉從它的符號。我卡在擴展類方法,這是一個有點亂:

Element carbon = ElementExtensions.FromAbbreviation("C"); 

我想與特定元素條目更大量的數據關聯起來,但我不知道這是否是一個好的設計或沒有。目前,每組相關數據都需要一個字典來獲取相關數據。也許我可以使用Dictionar?

如果我去了一個Element類,我需要確保只有一個氫的實例,一個氦氣等。我喜歡System.Drawing.Color的設計方式,但我不認爲這正是我需要什麼(例如,你永遠不必查找ForestGreen的相關數據)。

什麼是最好的方式來支持一個大的,但明確定義和有限數量的特定實例?

回答

2

enum對於這個問題似乎並不是很適合的方法;相反,你應該創建一個Element類爲每個已知元素相關聯的每個元素的所有信息,以及靜態只讀屬性:

public class Element 
{ 
    private readonly string _symbol; 
    private readonly int _atomicNumber; 
    private readonly Color _color 


    // Private constructor, since you don't want people to be able to "invent" random elements... 
    private Element(string symbol, int atomicNumber, Color color) 
    { 
     _symbol = symbol; 
     _atomicNumber = atomicNumber; 
     _color = color; 
    } 

    public string Symbol { get { return _symbol; } } 
    public int AtomicNumber { get { return _atomicNumber; } } 
    public Color color { get { return _color; } } 


    // Known elements 

    private static readonly Element _hydrogen = new Element("H", 1, Color.White); 
    private static readonly Element _carbon = new Element("C", 6, Color.Black); 
    private static readonly Element _oxygen = new Element("O", 8, Color.Red); 


    public static Element Hydrogen { get { return _hydrogen; } } 
    public static Element Carbon { get { return _carbon; } } 
    public static Element Oxygen { get { return _oxygen; } } 


    ... 

} 

這樣有關元素的所有信息可以在一個地方,而不是分散在許多不同的地方

2

如果你有很多枚舉,你應該重新考慮是否應該使用繼承。

而不是Element.Neon爲什麼不讓霓虹從Element繼承?

class Element 
int Radius(); 
Color Color(); 
string Symbol(); 

class Neon : Element 
int Radius (return x); 
int Color (return Color.Red); 
int Symbol (return "NE"); 

如果您只需要一個元素,請考慮使用單例。

+1

要麼是具有某種默認邏輯的抽象類,要麼是一個接口。 – Carra 2011-12-14 08:55:04

+0

我認爲這將是最好的方式,因爲我記得我的化學類有元素週期表中相似的元素組。他們應該在這種情況下共享相同的基類 – 2011-12-14 09:01:05

+0

我花了一半的時間在Java中,他們的枚舉版本更像這樣...這是我想表達的模式 – colithium 2011-12-14 09:55:46

1

將您的元素定義爲類,但使用Flyweight模式。