Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types a";标签集装箱;?_Types_Software Design_Bitmask - Fatal编程技术网

Types a";标签集装箱;?

Types a";标签集装箱;?,types,software-design,bitmask,Types,Software Design,Bitmask,在我的问题中,我有一组不同的类型和这些类型的Holder(或者容器,如果您喜欢该术语)类。每个Holder都可以与任何类型的元素关联,但具有任意限制 问题是类型的结构可能非常复杂,我可以有一些不同行为的子类型,如A1、A2、A3、B1、B2 例如,我可以有一个类Car和一个子类型Convertible,另一个类helposer和一个Apache子类型,并使容器能够仅与这两个特定类型关联。汽车和直升机都将派生自同一父类(车辆,如下示例) 这本身并不是一个很难解决的问题,但我想让它足够灵活和可维护。

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

问题是类型的结构可能非常复杂,我可以有一些不同行为的子类型,如
A1、A2、A3、B1、B2

例如,我可以有一个类
Car
和一个子类型
Convertible
,另一个类
helposer
和一个
Apache
子类型,并使容器能够仅与这两个特定类型关联。
汽车
直升机
都将派生自同一父类(
车辆
,如下示例)

这本身并不是一个很难解决的问题,但我想让它足够灵活和可维护。类型不会硬编码,而是来自易于生成和读取的配置文件;配置
支架
应该像
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];
    }
}
公共类类型管理器{
私有静态uint_ID=0;
私有静态字典typemap=新字典();
公共静态uint GetType(列表类型){
字符串键=”;
for(int i=0;i”;
返回GetType(key);
}
公共静态uint GetType(字符串键){
如果(!typemap.ContainsKey(键)){
typemap[key]=\u ID++;
}
返回类型映射[键];
}
}

我最终创建了一个管理器,用于存储不同的类型,并将其对应的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];
    }
}
公共类类型管理器{
私有静态uint_ID=0;
私有静态字典typemap=新字典();
公共静态uint GetType(列表类型){
字符串键=”;
for(int i=0;i”;
返回GetType(key);
}
公共静态uint GetType(字符串键){
如果(!typemap.ContainsKey(键)){
typemap[key]=\u ID++;
}
返回类型映射[键];
}
}