"Tagged container"的好解决方案?



在我的问题中,我有一组不同的类型和一个Holder(如果您喜欢该术语(如果您喜欢该术语))类别为这些类型。每个Holder都可以与任何类型的元素相关联,但有任意限制。

问题是类型的结构可能很复杂,我可以具有具有不同行为的A1,A2,A3,B1,B2之类的子类型。

例如,我可以拥有一个类Car和一个子类型Convertible,以及带有Apache子类型的另一类Helicopter,并使容器能够仅与这两种特定类型相关联。CarHelicopter都将从同一父类派生(Vehicle,遵循示例)。

这并不是一个很难的问题本身,但我想使其灵活且可维护。这些类型不会被硬编码,而是来自应该易于生成和读取的配置文件;配置Holders应该像A1 | B3 | C2一样容易。因此,我找不到灵活性和可用性之间的最佳位置。

必须有一些解决方案甚至模式。想到一些带有口罩的东西,但我没有它们的经验,我也不知道使用它们的最佳方法。

您知道这个特定问题的一些很好的解决方案吗?

我最终创建了一个存储不同类型的管理器,并将其相应的ID作为无符号INT。我的软件并不真正在乎用户定义的任意标签,因此每个标签组合的单个数字就可以了。我们可以将一种类型视为每个元素具有类型列表的抽象。

我的经理为每个标签组合分配一个ID,因此,如果将相同的标签放置两次,则会给出相同的结果。然后,整数比任何类型的列表都更易于比较。

它也比我考虑的其他选项更易于使用和实现。

在这里您有一个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];
    }
}

最新更新