Method overriding/hiding behavior in C#
我对c的理解是,子类不能重写父类的方法实现,除非该方法被标记为虚拟的。如果子类声明的方法与未标记为虚拟的父方法同名,则它只隐藏该方法,因此如果从父类型的引用调用该方法,则它将调用父方法;如果从子类类型的引用调用该方法,则它将调用子类方法。但是,我在C库中发现了一种情况,它似乎破坏了这种行为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public void Test() { ObservableCollection<String> strings1 = new ObservableCollection<String>(); strings1.CollectionChanged += OnCollectionChanged; strings1.Add("One String"); Collection<String> strings2 = strings1; strings2.Add("Another String"); } public void OnCollectionChanged(Object source, NotifyCollectionChangedEventArgs e) { Console.WriteLine("Collection Change!"); } |
由于
1 2 | Collection Change! Collection Change! |
有人能解释一下这是怎么回事吗?
ObservableCollection没有自己的Add方法。相反,它依赖于集合类添加,即:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Collection<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable { public void Add(T item) { if (this.items.IsReadOnly) ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection); this.InsertItem(this.items.Count, item); } protected virtual void InsertItem(int index, T item) { this.items.Insert(index, item); } } |
insertitem是ObservableCollection中重写的虚拟方法。
1 2 3 4 5 6 7 8 9 10 11 | public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged { protected override void InsertItem(int index, T item) { this.CheckReentrancy(); base.InsertItem(index, item); this.OnPropertyChanged("Count"); this.OnPropertyChanged("Item[]"); this.OnCollectionChanged(NotifyCollectionChangedAction.Add, (object) item, index); } } |
ObservableCollection