私は現在IDictionary <を拡張しているインターフェイス(および拡張辞書<>)を持っていますが、このインターフェイスの実装ではエントリを追加または削除できません(既存のエントリを許可したいしかし変更する)。私は単にReadOnlyCollectionのアプローチを取ってNotSupportedExceptionをスローすることができますが、これは少し間違っていると感じます。メソッドを隠して、別のインタフェースの背後にあるメソッドの実装方法が違うのは悪い考えですか?
代わりに私はインターフェイスを壊したいので、アクセサービット用とミューテータビット用の2つがありました。
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; }
}
そして、実装クラスこれは、私がこのような何かを(簡潔にするため削除ほとんどのメソッドを)終わったこれを実行することを除いて、すべてokです私はIDictionary
とIAccessor
にインデクサーの間であいまいさを避けるために、インデクサ新をしなければならなかった
public class AttributeDictionary<TKey,TValue>: Dictionary<TKey, TValue>, IAttributeDictionary<TKey, TValue>
:として定義されます。実際の問題は、Dictionary
のセッターインデクサーの動作が辞書に新しいエントリを作成することです。 IAccessor
インターフェイスでエントリの変更のみを許可し、作成しないようにするには、AttributeDictionary
の実装で何をすべきですか? IAccessor
インデクサメソッドを明示的に実装する必要があります。これは、指定されたキーが辞書にあるかどうかを最初にチェックし、そうでない場合は例外をスローします。または、IAccessor
インターフェイスでインデクサーを捨て、代わりにGetValue
とSetValue
のメソッドを使用し、混乱を避ける必要がありますか?
ありがとうございました。たぶん私の質問から明らかではなかったが、私はAttributeDictionaryのセッターに新しい値を追加できるようにしたい。私は、IAccessorインターフェイスのセッターを介して新しい値を追加することを拒否したいだけです(それはそのように文書化されます)。他のクラスでは、IAccessorインターフェイスだけを実装するので、最初にこの分割を行いたいのです。私たちは、IAccessorインターフェイスの実装だけを必要とする新しい属性を追加する必要はありませんが、(AttributeDictionaryのように)変更可能なオブジェクトを渡すことができます... ctd –
またはできないオブジェクト(つまり、IAccessor自体しか実装していないもの) –
ああ、うーん。私はあなたの質問を間違えたと思う。なぜIAccessorにはsetメソッドがありますか?なぜそれをゲット専用にしないのですか?私はそれが問題を単純化できると思う。 –