我有一个当前扩展 IDictionary<> 的接口(以及一个扩展 Dictionary<> 的实现),但我想要一个不允许添加或删除条目的接口的实现(我想允许现有的条目虽然改变了)。我可以采用 ReadOnlyCollection 方法并抛出 NotSupportedException,但这感觉有点不对劲。
相反,我想分解接口,所以我有一个用于访问器位,一个用于更改器位。这一切都很好,只是为了做到这一点,我最终得到了这样的结果(为简洁起见,大多数方法都被删除了):
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
。但真正的问题是设置器索引器在 a 上的行为是Dictionary
在字典中创建一个新条目。因为我希望IAccessor
界面只允许修改条目而不是创建条目,我应该在实现中做什么AttributeDictionary
?我是否应该明确实现IAccessor
索引器方法,该方法首先检查给定键是否在字典中,如果没有则抛出异常,或者拥有 2 个具有不同行为的索引器是个坏主意?或者我应该放弃IAccessor
界面中的索引器而只使用GetValue
andSetValue
方法并避免混淆?