编辑

从海报提示中,我在MSDN上找到了以下有用的链接:

How to: Raise Base Class Events in Derived Classes (C# Programming Guide)

Derived classes cannot raise base class events

重构时,我遇到了一个有趣的问题,到目前为止我还没有找到答案:

重构包括创建一个实现abstractINotifyPropertyChanged基类,派生类型将使用它而不是实现接口(interface)本身。

派生类型可以使用基类事件PropertyChanged还是必须按如下所示覆盖它们?

如果他们必须使用override,您能解释为什么要这样做吗?

(注意:重构由Resharper建议)

public abstract class BaseDTO : INotifyPropertyChanged
{
    public virtual event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class ReviewDTO : BaseDTO
{
    private ImageSource _image;
    private string _summary;
    private string _url;

    public string Url
    {
        get { return _url; }
        set
        {
            if (value == _url) return;
            _url = value;
            OnPropertyChanged();
        }
    }

    public string Summary
    {
        get { return _summary; }
        set
        {
            if (value == _summary) return;
            _summary = value;
            OnPropertyChanged();
        }
    }

    public ImageSource Image
    {
        get { return _image; }
        set
        {
            if (Equals(value, _image)) return;
            _image = value;
            OnPropertyChanged();
        }
    }

    public override event PropertyChangedEventHandler PropertyChanged;
}

最佳答案

我不认为他们必须覆盖。

基本类型可以定义一个



派生的类可以调用基本方法来触发属性通知。

刚刚发现了一些支持证据:
MSDN page on implementing INotifyPropertyChanged

当然,您的基本类型可以添加更多的东西

  • 就像每个唯一的属性名称(较少的垃圾对象)仅创建一个事件args实例
  • 通过CallerMemberName推断属性的名称
  • 使用lambda表达式形式来标记不正确的属性名称
  • 关于c# - 基类实现INotifyPropertyChanged : can derived types use its PropertyChanged event?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19521963/

    10-16 23:59