2016-05-04 10 views
1

Ich entwickle ein WPF mit MVVM-Muster, .NET Framework 4.6.1. und C#.Zusammensetzung statt Vererbung

Meine Frage ist nicht über WPF, ist es über die Verwendung von Zusammensetzung anstelle der Vererbung mit diesen beiden Klassen:

public class ObservableObject : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

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

Und:

public class MainViewModel : ObservableObject 
{ 
    private string statusPrinter; 

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

MainViewModel Vererbung von ObservableObject und ich will nicht Vererbung verwenden.

Ich kann dies tun:

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(); 
    } 
} 

Aber es scheint ein Problem mit public event PropertyChangedEventHandler PropertyChanged; in ObservableObject zu sein, wenn ich Zusammensetzung verwenden. Das Problem ist, wenn XAML-Link.

Kann ich Komposition hier verwenden oder muss ich Vererbung verwenden?

+2

Es ist eine sehr seltsame Anforderung. Warum willst du hier keine Erbschaft? – Dennis

+0

@Dennis Ich lese das Buch 'Microsoft .NET: Architecting-Anwendungen für das Unternehmen, Second Edition' und es geht darum, Vererbung zu vermeiden. – VansFannel

+1

Ersetzen Sie für Ihre zukünftige Vernunft diese hartcodierten Strings durch 'nameof' Anweisungen! Sie müssen sicherlich in Ordnung C# 6 verwenden, wenn Sie auf .NET 4.6.1 zielen. – TheInnerLight

Antwort

5

Sie können Komposition hier nicht verwenden, zumindest nicht in einer Weise, die Sie vorgestellt haben. Wenn etwas Benachrichtigungen zu Eigentumsänderungen für Ihr MainViewModel Objekt abonnieren möchte, wird zunächst überprüft, ob MainViewModelINotifyPropertyChanged implementiert. Es ist in Ihrem Fall nicht - so kann es niemanden über Eigentumsänderungen informieren.

Wenn Sie nicht von ObservableObject erben möchten - nicht. Implementieren Sie einfach INotifyPropertyChanged in MainViewModel, es ist nichts falsch daran.

+0

Danke. Ich habe über Ihre Lösung nachgedacht und wenn ich sie verwende, muss ich 'INotifyPropertyChanged' für jede' ViewModel' Klasse implementieren. Ich lese das Buch "Microsoft .NET: Architecting-Anwendungen für das Unternehmen, Second Edition" und es geht darum, Vererbung zu vermeiden und Komposition zu verwenden. Aber ich denke, ich könnte Komposition verwenden, wenn es möglich ist, aber das ist nicht der Fall. – VansFannel

+2

Die INotifyPropertyChanged-Implementierung könnte ein gutes Beispiel dafür sein, was in einigen Programmiersprachen als Mixin bezeichnet wird (https://en.wikipedia.org/wiki/Mixin). Es ist ein kleines Stück Verhalten, das ohne Vererbung wiederverwendet werden kann. Aber C# unterstützt keine Mixins, daher müssen Sie es immer und immer wieder implementieren oder Vererbung verwenden, auch wenn es sich für Sie falsch anfühlt. Komposition ist aber sowieso nicht geeignet. Wie für die Zusammensetzung - google für "Komposition über Vererbung" und Sie finden viele Links mit sinnvollen Beispielen dafür (auch in Wikipedia). – Evk