2017-02-27 6 views
1

私の問題では、さまざまなタイプのセットと、これらのタイプのHolder(またはその用語が好きな場合はコンテナ)クラスがあります。各Holderは任意のタイプの要素に関連付けることができますが、任意の制限があります。「タグ付きコンテナ」に適したソリューションですか?

問題は、タイプの構造がかなり複雑になる可能性があります。サブタイプは、いくつかの異なる動作でA1,A2,A3,B1,B2のようにすることができます。例えば

、私はクラスCarとサブタイプConvertible、およびApacheサブタイプを持つ別のクラスHelicopterを持っており、コンテナは唯一、この2つの特定のタイプに関連付けることができるようにすることができます。 CarHelicopterの両方は、同じ親クラス(この例に続くVehicle)から派生します。

これは実際には難しい問題ではありません。それ自体はですが、私はそれを柔軟かつ十分に保守したいと考えています。タイプはハードコードされませんが、生成および読み込みが容易な設定ファイルから来ます。 Holdersの設定はA1 | B3 | C2と同じくらい簡単です。だから、私は柔軟性と使いやすさの間にスイートスポットを見つけることはできません。

解決策やパターンが必要です。ビットマスクで何かを考えましたが、私はそれらの経験がなく、私はそれらを使用する最良の方法を知らない。

この特定の問題の良い解決策をご存知ですか?

答えて

0

さまざまなタイプを格納し、対応するIDを符号なしintとして与えるManagerを作成しました。私のソフトウェアは、ユーザーが定義した任意のタグを本当に気にするものではないので、各タグの組み合わせごとに1つの数字だけで問題ありません。型は、各要素が持つ型のリストの抽象として考えることができます。

私のマネージャーは各タグの組み合わせにIDを割り当てます。そのため、同じタグを2回置くと同じ結果が得られます。それで、整数はどの型のリストよりも比較が容易です。

私が考えていた他のオプションよりも使いやすく実装が簡単です。

ここでは、私はC#のプロトタイプを持っている、それはおそらく決定的ではないのですが、あなたのアイデアを得る:

public class TypeManager{ 
    private static uint _ID = 0; 
    private static Dictionary<string,uint> typemap = new Dictionary<string,uint>(); 

    public static uint GetType<T>(List<T> types) { 
     string key = ""; 
     for(int i = 0; i < types.Count; ++i) 
      key += types[i] + ">"; 
     return GetType(key); 
    } 

    public static uint GetType(string key) { 
     if(!typemap.ContainsKey(key)) { 
      typemap[key] = _ID++; 
     } 
     return typemap[key]; 
    } 
} 
関連する問題