2011-12-14 9 views
0

私は最近、コンピュータグラフィックスクラスの分子/タンパク質ビューアでの作業を完了しました。原子は明らかにそのようなプログラムの非常に重要な部分です。現在、私は各要素(水素、ヘリウムなど)を含む大きな列挙型を持っています。各要素は、私が書くことができますので、私は拡張クラスを使用しているなど、色、半径、などの情報が関連付けられている:適切な大規模な列挙型デザイン

float r = Element.Neon.Radius(); 

を私もそれがシンボルだから、対応する列挙型を取得できるようにする必要があります。私は特定の要素のエントリでより多くのデータを関連付けたいが、これは良いデザインであるかどうか、私はよく分からない

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

:私は少し厄介である拡張クラスでそのメソッドを立ち往生。現在、関連データの各セットには、関連付けられたデータを取得するための辞書が必要です。おそらく、私はDictionarを使うことができましたか?

私がElementクラスに行った場合、水素、ヘリウムなどのインスタンスが1つだけであることを確認する必要があります。System.Drawing.Colorがどのように設計されているのが好きですが、私が必要とするもの(たとえば、ForestGreenの関連データを検索する必要はありません)。

大きいが明確に定義された有限数の特定のインスタンスをサポートするにはどうすればよいですか?

答えて

2

列挙型は、この問題に対する適切なアプローチではありません。代わりに、あなたはすべての各要素に関連する情報、および既知の各要素の静的読み取り専用のプロパティで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; } } 


    ... 

} 

この道を要素に関するすべての情報は、多くの中に散在するのではなく、一つの場所にすることができ異なる場所

+0

私はJavaとそのバージョンenumはこれにもっと似ています...私はそれがenumになるように強制しようとしていたと思います – colithium

2

多くの列挙型を使用している場合は、代わりに継承を使用する必要があるかどうか再考する必要があります。

Element.Neonの代わりに、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つだけ必要な場合は、シングルトンを使用することを検討してください。

+1

デフォルトロジックを持つ抽象クラスか、実際にはインターフェイスです。 – Carra

+0

私は化学クラスから、同じような周期表の元素のグループがあることを思い出して、これが最良の方法だと思います。彼らはこの場合、同じ基底クラスを共有する必要があります –

+0

私はJavaで自分の時間の半分を費やしています。enumのバージョンはこれより似ています...これは私が表現したかったパターンです – colithium

1

エレメントをクラスとして定義しますが、Flyweightパターンを使用してください。

+0

私は一般的なパターンを見直す必要があると思います。 – colithium

関連する問題