Oop 强制在字符串键/ID上键入 一个通用的OO语言(例如C++、C语言、java) 我有一个带有字符串ID的对象映射,相同ID也是相对对象的键 class Foo(){ Foo(string id){this.id = id;} string id; string otherProperty; } map<string,Foo> foos;

Oop 强制在字符串键/ID上键入 一个通用的OO语言(例如C++、C语言、java) 我有一个带有字符串ID的对象映射,相同ID也是相对对象的键 class Foo(){ Foo(string id){this.id = id;} string id; string otherProperty; } map<string,Foo> foos;,oop,types,reuseidentifier,Oop,Types,Reuseidentifier,我不喜欢重复字符串,它只会变得最糟糕(当按键检索时,它会爆炸) 我不能使用枚举(因为在某些语言中,比如C++),它不能轻易转换为字符串,而我需要它) 唯一的选择似乎是一系列的 const string MY_FIRST_ID = "myFirstID"; const string MY_SECOND_ID = "mySecondID"; 到那时 foos.add(MY_FIRST_ID, new Foo(MY_FIRST_ID)); 这种解决方案更好,但仍然非常冗长,在同一个类中仍然存在一些

我不喜欢重复字符串,它只会变得最糟糕(当按键检索时,它会爆炸)

我不能使用枚举(因为在某些语言中,比如C++),它不能轻易转换为字符串,而我需要它)

唯一的选择似乎是一系列的

const string MY_FIRST_ID = "myFirstID";
const string MY_SECOND_ID = "mySecondID";
到那时

foos.add(MY_FIRST_ID, new Foo(MY_FIRST_ID));
这种解决方案更好,但仍然非常冗长,在同一个类中仍然存在一些耦合,并且没有强制执行值(就像枚举中的值)

你能想出更好的模式吗


另一种解决方案是只使用enum作为键,并将字符串作为简单字段。但这需要在Foo和FooManager(实例化Foo实例的类)之间添加高耦合性

var f = new Foo("myFirstID")
然后做一个

map.add(f.id, f);
另一件需要探索的事情是,如果需要使用该键只是为了提供对象foo的唯一性,那么可以探索hashset集合,该集合在c#和java世界中都可用。如果您提供了IEqualityComparer,您只需添加和删除foo对象即可。如果您不需要使用字符串acessor访问哈希集,这可能是一个解决方案。

在C#中,您可以执行以下操作:

string foo;
map.add(foo = "myFirstID", new Foo(foo));

我不确定你是否能在java或C++中做同样的事情,但是这是一个很好的注视点。

谢谢,但是这个问题只是延迟到了第一个需要的地图。此外,未提供唯一性,也未强制执行提供的值。
string foo;
map.add(foo = "myFirstID", new Foo(foo));