0

我有一个扩展 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
    }
}
4

3 回答 3

3

GetKey在 中定义SortedList,它实际上是一个完全独立于 的类SortedList<TKey, TValue>。您的原始代码也有错误;如果您实际使用/ ,不会编译:GetKeySortedList

return GetKey(name);

相反,只需使用IDictionary索引器:

return this[name];
于 2012-05-19T01:51:59.873 回答
2

类中没有名称GetKey的方法SortedList<TKey, TValue>

于 2012-05-19T01:51:49.320 回答
2

没有GetKey(),这已经很清楚了。正确的实现是:

public SymbolTableEntry Lookup(string name)
{
    return this[name];
}

这应该让你停下来,方法是多余的。SortedList 的索引器已经足够完成工作了。所以只要去掉这个方法,这个类的用户将无法猜测使用哪一个。

请注意,Add() 与 Enter() 存在类似的问题。当客户端程序员使用 Add() 时,不会发生任何好事。您真正想要做的是替换或隐藏 Add() 方法,但这是不可能的。你可以超载它,但这是可以做到的。

.NET 集合类并不是真正设计为从中派生的,它们的方法不是虚拟的。如果您封装它们,它们会更好地工作,创建您自己的仅继承 IDictionary 的集合类并使用私有的 SortedList 来完成工作。这是相当多的工作,但它会非常干净。

于 2012-05-19T02:33:49.470 回答