使哈希表不可变

发布于 2024-08-07 18:24:41 字数 78 浏览 2 评论 0原文

如何从 Hashtable 生成派生类,可以添加其中的对象,但不能删除或替换?

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

How do I make a derived class from Hashtable, objects of which can be added, but cannot be removed or replaced?

What do I have to override and particularly how do I override the [] operator?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情场扛把子 2024-08-14 18:24:41

在这种情况下,您可能应该封装它,而不是从字典(您应该使用它而不是哈希表)派生。

Dictionary 有很多允许更改集合的方法,将其设为私有成员更容易,然后只需实现添加和访问项目的方法即可。

像这样的东西:

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();
   }

}

Instead of deriving from the Dictionary (which you should use rather than a HashTable), you should probably encapsulate it in this case.

The Dictionary has a lot of methods that allow changing the collection, it's easier to make it a private member, and then just implement the methods to add and access items.

Something like:

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();
   }

}
或十年 2024-08-14 18:24:41

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

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

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

At a minimum, you should override Clear, Remove, the property Values and the indexer Item. You can override the indexer Item using the syntax:

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

You need to override Clear so that a user can't clear the hashtable. You need to override Remove so that a user can't remove entires from the hashtable. You need to override Values because a user could use the ICollection that is returned to modify the values in the hashtable. You need to override Item for a similar reason.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文