2013-10-22 14 views
7

EDITKlasa podstawowa implementuje INotifyPropertyChanged: typy pochodne mogą używać zdarzenia PropertyChanged?

Od plakatów podpowiedzi, Znalazłem następujące pomocne linki na MSDN:

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

Derived classes cannot raise base class events


Podczas refaktoryzacji Natknąłem ciekawy Pytanie, na które nie znalazłem dotychczas odpowiedzi:

Refaktoryzacja polega na utworzeniu klasy bazowej abstract, która implementuje INotifyPropertyChanged, a wyprowadzone typy użyłyby jej zamiast implementacji samego interfejsu.

Czy typy pochodne mogą wykorzystywać zdarzenie klasy bazowej PropertyChanged, czy muszą je przesłonić, jak pokazano poniżej?

Jeśli muszą override, czy możesz wyjaśnić powody, dla których tak powinno być?

(uwaga: refaktoring zostało zasugerowane przez 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; 
} 
+1

Nie ma absolutnie żadnego powodu (który mógłbym wymyślić), aby samo zdarzenie było wirtualne lub przesłonięte. –

+0

Mam zaktualizowane pytanie z odpowiednimi linkami z MS, które potwierdzają twoje słowa, dziękuję wszystkim! – Aybe

Odpowiedz

5

Nie sądzę, że koniecznością nadpisanie.

typu zasadę można zdefiniować

chroniony utratę RaisePropertyChanged (ciąg nazwaWłaściwości);

Uzyskane klasy mogą wywołać metodę bazową w celu wywołania powiadomień o właściwościach.

Wystarczy znaleźć jakieś dowody potwierdzające: MSDN page on implementing INotifyPropertyChanged

Oczywiście, Twój typ bazowy można dodać więcej bajerów

  • jak tworzenie tylko jedna instancja args zdarzeń na unikalnej nazwy właściwości (mniej obiektów śmieci)
  • Podawanie nazwy obiektu za pomocą CallerMemberName
  • przy użyciu formularza wyrażenia lambda w celu oznaczenia nieprawidłowych nazw właściwości
+0

Co masz na myśli, używając formularza wyrażenia lambda? – Aybe

+1

Zobacz post autorstwa bitbonk w tym wątku http://compositeextensions.codeplex.com/discussions/53731 na temat używania wyrażeń lambda do sprawdzania nazw właściwości podczas kompilacji – Gishu

Powiązane problemy