現在 IDictionary<> を拡張するインターフェース (および Dictionary<> を拡張する実装) がありますが、エントリの追加または削除を許可しないこのインターフェースの実装が必要です (既存のエントリを変わったけど)。ReadOnlyCollection アプローチを採用して NotSupportedException をスローすることもできますが、これは少し間違っているように感じます。
代わりに、インターフェイスを分割して、アクセサー ビット用に 1 つ、ミューテーター ビット用に 1 つ用意しました。これを行うために、次のような結果になったことを除いて、これはすべて問題ありません(簡潔にするためにほとんどのメソッドを削除しました):
public interface IAccessor<TKey, TValue>
{
TValue this [TKey key] { get; set; }
}
そして、私の元のインターフェースは次のようになりました。
public interface IAttributeDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IAccessor<TKey, TValue>
{
new TValue this [TKey key] { get; set; }
}
そして、次のように定義された実装クラス:
public class AttributeDictionary<TKey,TValue>: Dictionary<TKey, TValue>, IAttributeDictionary<TKey, TValue>
と のインデクサー間のあいまいさを避けるために、インデクサーを新しくする必要がIDictionary
ありIAccessor
ました。ただし、実際の問題は、上のセッター インデクサーの動作がDictionary
辞書に新しいエントリを作成することです。インターフェイスでエントリの変更のみを許可し、作成は許可しないようにしたいのでIAccessor
、の実装で何をすべきAttributeDictionary
ですか? 指定されたキーが辞書にあることを最初にチェックし、そうでない場合は例外をスローするインデクサーメソッドを明示的に実装する必要がIAccessor
ありますか、または異なる動作を持つ2つのインデクサーを持つことは悪い考えですか? IAccessor
それとも、インターフェイスのインデクサーを捨てて、代わりにGetValue
andSetValue
メソッドを使用して混乱を避けるべきですか?