为什么可观察字典是通过实现接口来实现的

本文关键字:实现 接口 观察 字典 为什么 | 更新日期: 2023-09-27 18:30:37

好的,所以我一直在寻找一个字典,当一段数据被更改时会抛出一个事件。我不断遇到的一个链接是:http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/12/26/observabledictionary-lt-tkey-tvalue-gt-c.aspx

检查 IDictionary 接口和字典类后,我可以清楚地看到 CRUD(创建读取更新删除)。理论上,所有词典都应该建立在此功能之上。

据我所知,实现可观察的字典应该像

public class test<K,V> : Dictionary<K,V>, INotifyCollectionChanged, INotifyPropertyChanging
{
    public event NotifyCollectionChangedEventHandler CollectionChanged;
    public event PropertyChangedEventHandler PropertyChanged;
    private const string pCount = "Count";
    private const string pKeys = "Keys";
    private const string pValues = "Values";
    public V this[K key]
    {
        get
        {
            return base[key];
        }
        set
        {
            object old = base[key];
            base[key] = value;
            if (CollectionChanged != null)
                CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, new KeyValuePair<K, V>(key, value), new KeyValuePair<K, V>(key, (V)old)));
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(pValues));
        }
    }
    public override void Add(K key, V value)
    {
        base.Add(key, value);
        if(CollectionChanged!=null)
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, new KeyValuePair<K,V>(key, value)));
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(pCount));
            PropertyChanged(this, new PropertyChangedEventArgs(pKeys));
            PropertyChanged(this, new PropertyChangedEventArgs(pValues));
        }
    }
    public override void Remove(K key)
    {
        object removed = base[key];
        base.Remove(key);
        if (CollectionChanged != null)
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, removed));
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(pCount));
            PropertyChanged(this, new PropertyChangedEventArgs(pKeys));
            PropertyChanged(this, new PropertyChangedEventArgs(pValues));
        }
    }
}

编辑:添加了更多内容,使其更像示例并帮助澄清问题

我不明白为什么要制作所有这些精心制作的词典,我缺少什么吗?有人可以向我解释一下吗?

感觉他们都在重新发明轮子,据我所知,这与可重用代码背道而驰,这是 OO 的重点。我真的觉得我一定错过了什么。

为什么可观察字典是通过实现接口来实现的

有几个原因导致您无法执行尝试执行的操作:

索引器、添加和删除方法不是虚拟的。 您无法override AddRemove方法,因为它们不是虚拟的。

由于您没有重写这些方法,因此您充其量只能重影它们,只要将对象键入为IDictionaryDictionary就不会触发事件。

通过使用组合而不是继承,如您链接到的示例所示,给定字典对象的人无法在不触发事件的情况下添加项目,因为无法直接访问字典。

INotifyPropertyChangedINotifyCollectionChanged的要点是它们被 使用。Net自己的DataBinding(例如WPF的,在较小程度上是winforms的)。

您自己的自定义OnValueAdd等委托在您自己的类之外是未知的,并且不能由 使用。Net的自动更改通知机制。