0

SortedList を拡張するクラスがあります。クラスで Add() や Remove() などの多くの SortedList メソッドを使用できますが、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 に答える