C# Can';扩展SortedList时,请不要使用某些方法
我有一个扩展SortedList的类。我可以在我的类中使用许多SortedList方法,比如Add()和Remove(),但由于某些原因,当我尝试使用GetKey()时,它不喜欢它。有人能告诉我为什么会发生这种情况吗C# Can';扩展SortedList时,请不要使用某些方法,c#,.net,collections,C#,.net,Collections,我有一个扩展SortedList的类。我可以在我的类中使用许多SortedList方法,比如Add()和Remove(),但由于某些原因,当我尝试使用GetKey()时,它不喜欢它。有人能告诉我为什么会发生这种情况吗 public class SymbolTableImplementation : SortedList<string, SymbolTableEntry>, SymbolTable { public SymbolTableEntry Enter(string n
public class SymbolTableImplementation : SortedList<string, SymbolTableEntry>, SymbolTable
{
public SymbolTableEntry Enter(string name)
{
SymbolTableEntry entry = SymbolTableFactory.CreateSymbolTableEntry(name, this);
Add(name, entry); // This is OK
return entry;
}
// Look up an existing symbol table entry. Null if it does not exist.
public SymbolTableEntry Lookup(string name)
{
return GetKey(name); // Doesn't exist in current context
}
}
公共类SymbolTable实现:SortedList,SymbolTable
{
公共SymbolTableEntry输入(字符串名称)
{
SymbolTableEntry=SymbolTableFactory.CreateSymbolTableEntry(名称,this);
添加(名称、条目);//这是可以的
返回条目;
}
//查找现有符号表项。如果不存在,则为Null。
公共SymbolTableEntry查找(字符串名称)
{
return GetKey(name);//当前上下文中不存在
}
}
在SortedList
类中没有名为GetKey
的方法。GetKey
在SortedList
中定义,它实际上是与SortedList
完全分离的类。您的原始代码中也有错误;如果您实际使用的是GetKey
/SortedList
,则不会编译:
return GetKey(name);
相反,只需使用IDictionary
索引器:
return this[name];
没有GetKey(),这已经很清楚了。适当的实施是:
public SymbolTableEntry Lookup(string name)
{
return this[name];
}
这会让你停下来,这个方法是多余的。SortedList的索引器已经足够好,可以完成这项工作。所以只要删除这个方法,这个类的用户就无法猜出使用哪个方法了
请注意,Add()与Enter()存在类似的问题。当客户端程序员使用Add()时,将不会发生任何好事。您真正想做的是替换或隐藏Add()方法,但这是不可能的。你可以让它超负荷工作,但这已经够了
NET集合类并不是真正设计用来派生的,它们的方法不是虚拟的。如果您封装它们,创建自己的集合类,只继承(比如)IDictionary,并使用私有的SortedList来完成工作,它们的工作会更好。这是一个相当大的工作量,但会非常干净。嗯,积垢。我完全没有注意到有两种不同类型的分类列表。这解释了为什么它不起作用。好的,返回键[name]代码>不起作用。它说“不能从字符串转换为int.”好的,现在它说的是:不能将类型“string”隐式转换为“explorer.intermediate.SymbolTableEntry”。哎呀,我没有意识到SortedList
是一个字典,因此从键获取值只需要普通的字典索引器访问。请看我最新的答案。是的,这就是我需要的。但是,我还需要它返回null
,而不是在密钥不存在时抛出异常,因此我最终执行了以下操作:return(ContainsKey(name)?this[name]:null)代码>-1因为你说“不喜欢这个”时没有告诉我们你的意思是什么是的,我没意识到这是一本字典。接得好!