【问题标题】:virtual and normal event of the same name in the same class同一类中的同名虚拟事件和普通事件
【发布时间】:2017-01-30 00:55:45
【问题描述】:

我不是一个绝对的初学者,但这个似乎超出了我的能力(或者我可能在一天结束时没有精力了 :))。以下代码片段试图实现什么(取自this SO post)?

public class ObservableStack<T> : Stack<T>, INotifyCollectionChanged, INotifyPropertyChanged
{
  //...

  protected virtual event PropertyChangedEventHandler PropertyChanged;

  //...

  event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged
  {
    add { this.PropertyChanged += value; }
    remove { this.PropertyChanged -= value; }
  }
}

我需要将其转换为 VB.NET,它似乎对存在两个 PropertyChanged 事件并不满意。在正确实现接口的同时还需要删除哪一个?

【问题讨论】:

  • 第二个是同一界面的an explicit implementation。例如,当您同时实现IEnumerable&lt;T&gt;System.Collections.IEnumerable 时,您会这样做。您可以使用两种不同的返回类型覆盖GetEnumerator() 两次,其中一种是显式的。那将是不可能的。显式事物允许编译器区分对两种不同方法的调用。我很好奇那个人为什么会在那里。
  • @EdPlunkett:但是查看类声明,唯一需要PropertyChanged 的接口是INotifyPropertyChanged。那我们为什么需要覆盖两次呢?
  • 我希望比我聪明的人能回答这个问题。
  • 我刚刚发现ObservableCollection&lt;T&gt; 以同样的方式(但不是虚拟的)。我不知道。 “框架会做什么?”是 IMO 的有效原则。
  • 哦,对了,真正的问题,哈哈!很简单,有两种方法:要么公开受保护的事件并删除显式事件,要么保持显式,如下所示:stackoverflow.com/questions/1577149/…

标签: c# vb.net events inotifypropertychanged


【解决方案1】:

在 VB 中有两种方法可以做到这一点。首先,也是最简单的,是摆脱INotifyPropertyChanged 的显式实现。公开受保护的事件,不要将显式事件与 add/remove 块一起使用。

然而,ObservableCollection&lt;T&gt; 恰好本身明确地实现了INotifyPropertyChanged,所以可能有一些很好的理由这样做。通常我会做框架做的任何事情,因为从历史上看,他们的想法平均而言比我的要好。在这种情况下,我不知道他们为什么这样做,但在最坏的情况下它不会受到伤害。

结果是you can implement interfaces explicitly in VB.NET。理论上。但我尝试做某事based on this Lovecraftian example code here,然后在恐惧和绝望中放弃了。

我认为只要定期实现接口就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2015-10-26
    • 2011-07-02
    • 1970-01-01
    相关资源
    最近更新 更多