使Hashtable不可变

时间:2009-10-19 16:18:39

标签: c# hashtable override immutability

如何从Hashtable创建派生类,可以添加对象但不能删除或替换?

我必须覆盖什么,特别是如何覆盖[]运算符?

2 个答案:

答案 0 :(得分:5)

不应该从Dictionary(你应该使用而不是HashTable)派生,你可能应该在这种情况下封装它。

“词典”有很多方法可以更改集合,更容易使其成为私有成员,然后只需实现添加和访问项目的方法。

类似的东西:

public class StickyDictionary<Key, Value> : IEnumerable<KeyValuePair<Key, Value>>{

   private Dictionary<Key, Value> _colleciton;

   public StickyDictionary() {
      _collection = new Dictionary<Key, Value>();
   }

   public void Add(Key key, Value value) {
      _collection.Add(key, value);
   }

   public Value this[Key key] {
      get {
         return _collection[key];
      }
   }

   public IEnumerable<KeyValuePair<Key, Value>> GetEnumerator() {
      return _collection.GetEnumerator();
   }

}

答案 1 :(得分:3)

至少应覆盖ClearRemove,属性Values和索引器Item。您可以使用以下语法覆盖索引器Item

public override this[object key] {
    get { // get implementation }
    set { // set implementation }
}

您需要覆盖Clear,以便用户无法清除哈希表。您需要覆盖Remove,以便用户无法从哈希表中删除entires。您需要覆盖Values,因为用户可以使用返回的ICollection来修改哈希表中的值。您出于类似原因需要覆盖Item