"Tagged container" 的好的解决方案?
Good solution for a "Tagged container"?
在我的问题中,我有一组不同的类型和一个 Holder
(或者容器,如果你喜欢那个术语)class 这些类型。每个 Holder
都可以关联到任何类型的元素,但有任意限制。
问题是类型的结构可能非常复杂,我可以有像 A1,A2,A3,B1,B2
这样的具有一些不同行为的子类型。
例如,我可以有一个 class Car
和一个子类型 Convertible
,以及另一个 class Helicopter
和一个 Apache
子类型,并使容器只能与这两种特定类型相关联。 Car
和 Helicopter
都将派生自同一个父 class(Vehicle
,按照示例)。
这本身并不是一个真正的难题,但我想让它足够灵活和可维护。这些类型不会被硬编码,而是来自应该易于生成和读取的配置文件;配置 Holders
应该和 A1 | B3 | C2
一样简单。所以我没有找到灵活性和可用性之间的最佳平衡点。
必须有一些解决方案,甚至是一种模式。想过一些带位掩码的东西,但我没有使用它们的经验,也不知道使用它们的最佳方法。
你知道这个具体问题的一些好的解决方案吗?
我最终创建了一个管理器,它存储不同的类型并将其相应的 ID 作为无符号整数提供。我的软件并不真正关心用户定义的任意标签,因此每个标签组合的单个数字就可以了。我们可以将类型视为每个元素具有的类型列表的抽象。
我的经理为每个标签组合分配了一个 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];
}
}
在我的问题中,我有一组不同的类型和一个 Holder
(或者容器,如果你喜欢那个术语)class 这些类型。每个 Holder
都可以关联到任何类型的元素,但有任意限制。
问题是类型的结构可能非常复杂,我可以有像 A1,A2,A3,B1,B2
这样的具有一些不同行为的子类型。
例如,我可以有一个 class Car
和一个子类型 Convertible
,以及另一个 class Helicopter
和一个 Apache
子类型,并使容器只能与这两种特定类型相关联。 Car
和 Helicopter
都将派生自同一个父 class(Vehicle
,按照示例)。
这本身并不是一个真正的难题,但我想让它足够灵活和可维护。这些类型不会被硬编码,而是来自应该易于生成和读取的配置文件;配置 Holders
应该和 A1 | B3 | C2
一样简单。所以我没有找到灵活性和可用性之间的最佳平衡点。
必须有一些解决方案,甚至是一种模式。想过一些带位掩码的东西,但我没有使用它们的经验,也不知道使用它们的最佳方法。
你知道这个具体问题的一些好的解决方案吗?
我最终创建了一个管理器,它存储不同的类型并将其相应的 ID 作为无符号整数提供。我的软件并不真正关心用户定义的任意标签,因此每个标签组合的单个数字就可以了。我们可以将类型视为每个元素具有的类型列表的抽象。
我的经理为每个标签组合分配了一个 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];
}
}