【发布时间】:2014-04-22 22:00:53
【问题描述】:
为什么 CollectionChanged 事件是ObservableCollection 中的虚拟?我们有虚拟的OnCollectionChanged 方法,应该足以覆盖事件调用吧?
我看不出这个有什么用,而且虚拟事件也是邪恶的。虚拟事件的笨拙使用会带来很多逻辑问题,但是虚拟事件即使在框架中也存在。
这只是糟糕的设计还是有人在实际中使用它?
【问题讨论】:
-
ObservableCollection是一个基类,不 使事件virtual是一个糟糕的设计。为什么你认为相反? -
乔恩,假设有人在派生类中重写了 CollectionChanged 事件,并让 OnCollectionChanged 方法保持不变。这使得每个订阅(甚至 wpf 引擎)都进入派生类的 CollectionChanged 事件,这会破坏方法 OnCollectionChanged,因为它会触发为空的基本事件
-
所以派生类的作者如果不注意自己在做什么,就可以写出bug。这很令人惊讶吗?是派生作者的错还是基础作者的错?
object.GetHashCode()是否应该不是虚拟的,因为您可以覆盖它而忘记覆盖Equals? -
是的,但如果没有强有力的理由,我宁愿不使用虚拟事件。在这里我看不出任何原因,因为通过重写 OnCollectionChanged 方法可以达到相同的逻辑
-
我们是否在讨论您的偏好或设计决策?如果事件不是
virtual,则派生类无法更改其底层表示,并且如果他们决定要检查订阅者,它们也无法检查。 “到目前为止我还不需要它”不是一个论点。