8

編集

ポスターのヒントから、MSDN で次の役立つリンクを見つけました。

方法: 派生クラスで基本クラス イベントを発生させる (C# プログラミング ガイド)

派生クラスは基本クラスのイベントを発生させることはできません


リファクタリング中に、これまで答えが見つからなかった興味深い質問に出くわしました。

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

派生型は基本クラスのイベントを使用できます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;
}
4

1 に答える 1

5

オーバーライドする必要はないと思います。

基本タイプは、

protected void RaisePropertyChanged(string プロパティ名);

派生クラスは基本メソッドを呼び出すだけで、プロパティ通知をトリガーできます。

いくつかの裏付けとなる証拠を見つけました: INotifyPropertyChanged の実装に関する MSDN ページ

もちろん、あなたの基本タイプはさらに良いものを追加できます

  • 一意のプロパティ名ごとにイベント引数のインスタンスを 1 つだけ作成するなど (ジャンク オブジェクトを減らす)
  • CallerMemberName によるプロパティの名前の推測
  • ラムダ式形式を使用して不適切なプロパティ名にフラグを立てる
于 2013-10-22T16:13:22.420 に答える