2016-05-04 7 views
1

MVVMパターン、.NET Framework 4.6.1でWPFを開発しています。とC#。継承の代わりに合成

public class ObservableObject : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChangedEvent(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

そして:

私の質問は、WPFに関するものではありません、それはこの2つのクラスを有する組成物の代わりに、継承を使用してのことだObservableObjectから

public class MainViewModel : ObservableObject 
{ 
    private string statusPrinter; 

    public string StatusPrinter 
    { 
     get { return statusPrinter; } 
     set 
     { 
      statusPrinter = value; 
      RaisePropertyChangedEvent("StatusPrinter"); 
     } 
    } 
} 

MainViewModel継承し、私はしたくありません継承を使用する。

public class MainViewModel 
{ 
    private string statusPrinter; 
    private ObservableObject observable; 

    public string StatusPrinter 
    { 
     get { return statusPrinter; } 
     set 
     { 
      statusPrinter = value; 
      observable.RaisePropertyChangedEvent("StatusPrinter"); 
     } 
    } 

    public MainViewModel() 
    { 
     observable = new ObservableObject(); 
    } 
} 

をしかし、私が組成物を使用する場合ObservableObjectpublic event PropertyChangedEventHandler PropertyChanged;に問題があるようです:

私はこれを行うことができます。問題は、XAMLリンク時です。

ここでコンポジションを使用できますか、または継承を使用する必要がありますか?

+2

非常に奇妙な要件です。なぜここに継承したくないのですか? – Dennis

+0

@Dennis「Microsoft .NET:エンタープライズ向けアプリケーションの構築、第2版」という本を読んで、継承を回避する方法について説明します。 – VansFannel

+1

あなたの将来のために、ハードコーディングされた文字列を 'nameof'ステートメントに置き換えてください! .NET 4.6.1をターゲットにしている場合は、C#6を使用しても問題ありません。 – TheInnerLight

答えて

5

ここでは、あなたが提示した方法ではなく、ここでコンポジションを使用することはできません。 MainViewModelオブジェクトのプロパティ変更の通知に何かを登録したいときは、まずMainViewModelINotifyPropertyChangedを実装しているかどうかをチェックします。あなたの場合はそうではありません。だから、誰にも財産の変更について通知することはできません。

ObservableObjectから継承したくない場合 - そうしないでください。 MainViewModelINotifyPropertyChangedを実装するだけで何も問題はありません。

+0

ありがとうございます。私はあなたのソリューションについて考えました。もし私がそれを使うなら、 'ViewModel'クラスごとに' INotifyPropertyChanged'を実装する必要があります。私は「Microsoft .NET:エンタープライズのためのアプリケーションの構築、第2版」という本を読んで、継承を避け、構成を使うことについて話します。しかし、私はそれが可能なときに作曲を使うことができると思うが、そうではない。 – VansFannel

+2

INotifyPropertyChanged実装は、いくつかのプログラミング言語(https://en.wikipedia.org/wiki/Mixin)でMixinと呼ばれるものの良い例になります。これは、継承なしで再利用できる小さな行動です。しかし、C#はミックスインをサポートしていないので、何度も何度も実装しなければならないし、実際に継承を使用する必要もあります。とにかくここでは構成は適合しません。 googleの "composition to inheritance"については、合理的な例(ウィキペディアでさえ)のリンクがたくさんあります。 – Evk

関連する問題