扩展排序列表时不能使用某些方法

本文关键字:方法 不能 排序 列表 扩展 | 更新日期: 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 来完成工作。 这是相当多的工作,但它会很干净。