2013-10-22 6 views
7

EDITポスターヒントから基本クラスはINotifyPropertyChangedを実装しています。派生型はPropertyChangedイベントを使用できますか?

は、私は、MSDNで以下の便利なリンクを見つけた:

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

Derived classes cannot raise base class events


は私が面白い渡って来てリファクタリングしながらこれまでの回答が見つからない質問:

リファクタリングは、INotifyPropertyChangedを実装するabstract基本クラスを作成することから成ります。派生型は、インタフェース自体を実装する代わりにそれを使用します。

派生型は、基本クラスのイベント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; 
} 
+1

イベント自体が仮想であるかオーバーライドされているという理由は全くありません。 –

+0

私はあなたの言葉を確認するMSからの関連リンクで質問を更新しました。ありがとうございます! – Aybe

答えて

5

私は彼らに必見オーバーライドしないと思います。

ベース型は、ボイドRaisePropertyChanged(文字列propertyNameの)保護

を定義することができます。

派生クラスは、基本メソッドを呼び出してプロパティ通知をトリガすることができます。

はいくつかの証拠が見つかりました:もちろん MSDN page on implementing INotifyPropertyChanged

を、あなたの基本型は、一意のプロパティ名あたりのイベント引数のインスタンスを1つだけ作成するような、よりいいもの

  • (以下ジャンクオブジェクト)
  • を追加することができます
  • は、CallerMemberName経由でプロパティの名前を推測する
  • ラムダ式を使用して不正なプロパティ名をフラグする
+0

ラムダ式を使用するとどういう意味ですか? – Aybe

+1

このスレッドのbitbonkの記事を参照してください。コンパイル時のプロパティ名チェックにラムダ式を使用する方法は、http://compositeextensions.codeplex.com/discussions/53731を参照してください。 – Gishu