title: Base class implements INotifyPropertyChanged : can derived types use its PropertyChanged event?
body: <p><strong>EDIT</strong></p>
  
  <p>From posters hints, I've found the following helpful links on MSDN:</p>
  
  <p><a href="http://msdn.microsoft.com/en-us/library/hy3sefw3.aspx">How to: Raise Base Class Events in Derived Classes (C# Programming Guide)</a></p>
  
  <p><a href="http://msdn.microsoft.com/en-us/library/0ecakwbz.aspx">Derived classes cannot raise base class events</a></p>
  
  <hr>
  
  <p>While refactoring I've come across an interesting question for which I haven't found an answer so far :</p>
  
  <p>The refactoring consists of creating an <code>abstract</code> base class which implements <code>INotifyPropertyChanged</code>, derived types would use it instead of implementing the interface themselves.</p>
  
  <p>Can derived types use the base class event <code>PropertyChanged</code> or must they override it as shown below ?</p>
  
  <p>If they must <code>override</code> it can you explain the reasons why it should be that way ?</p>
  
  <p>(note: refactoring has been suggested by Resharper)</p>
  
  <pre><code>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;
  }
  </code></pre>