扩展SortedList时无法使用某些方法

时间:2012-05-19 01:48:01

标签: c# .net collections

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

3 个答案:

答案 0 :(得分:3)

GetKeySortedList中定义,它实际上是与SortedList<TKey, TValue>完全分开的类。您的原始代码也有错误;如果 实际使用GetKey / SortedList,则无法编译:

return GetKey(name);

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

return this[name];

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

哪个应该给你暂停,这个方法是多余的。 SortedList的索引器已经足够完成工作了。因此,只需删除此方法,此类的用户将无法猜出要使用哪一个。

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

.NET集合类实际上并非设计用于派生,它们的方法不是虚拟的。如果封装它们,它们会更好地工作,创建自己的集合类,只继承IDictionary并使用私有的SortedList来完成工作。这是相当多的工作,但它将是干净利落的。