扩展排序列表时不能使用某些方法
本文关键字:方法 不能 排序 列表 扩展 | 更新日期: 2023-09-27 18:34:50
我有一个扩展 SortedList 的类。我可以在我的类中使用许多 SortedList 方法,如 Add(( 和 Remove((,但由于某种原因,当我尝试使用 GetKey(( 时它不喜欢它。谁能告诉我为什么会发生这种情况?
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
}
}
GetKey
是在SortedList
中定义的,它实际上是一个与SortedList<TKey, TValue>
完全独立的类。 您的原始代码也有错误;如果您实际使用的是 GetKey
/SortedList
,则不会编译:
return GetKey(name);
相反,只需使用IDictionary
索引器:
return this[name];
SortedList<TKey, TValue>
类中没有名称GetKey
的方法。
No GetKey((,这已经很清楚了。 正确的实现是:
public SymbolTableEntry Lookup(string name)
{
return this[name];
}
这应该让你停下来,这种方法是多余的。 SortedList 的索引器已经足够好,可以完成工作了。 因此,只需删除此方法,此类的用户将无法猜测要使用哪个方法。
请注意,Add(( 与 Enter(( 也有类似的问题。 当客户端程序员使用 Add(( 时,不会发生任何好事。 你真正想做的是替换或隐藏 Add(( 方法,但这是不可能的。 你可以重载它,但这是可以做到的。
.NET 集合类并不是真正设计为派生自,它们的方法不是虚拟的。 如果您封装它们,创建自己的集合类,则它们会更好地工作,该集合类仅继承(例如 IDictionary(并使用私有 SortedList 来完成工作。 这是相当多的工作,但它会很干净。