组成而不是继承

Van*_*nel 3 c# inheritance mvvm object-composition

我正在使用MVVM模式.NET Framework 4.6.1开发WPF.和C#.

我的问题不是关于WPF,而是关于使用组合而不是继承这两个类:

public class ObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

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

和:

public class MainViewModel : ObservableObject
{
    private string statusPrinter;

    public string StatusPrinter
    {
        get { return statusPrinter; }
        set
        {
            statusPrinter = value;
            RaisePropertyChangedEvent("StatusPrinter");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MainViewModel继承自我ObservableObject,我不想使用继承.

我可以做这个:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但它似乎是一个问题public event PropertyChangedEventHandler PropertyChanged;ObservableObject时候我用的组合物.问题出在XAML链接时.

我可以在这里使用组合还是必须使用继承?

Evk*_*Evk 7

你不能在这里使用作文,至少不是你提出的方式.当某些东西想要订阅MainViewModel对象的属性更改通知时- 它将首先检查是否有MainViewModel实现INotifyPropertyChanged.它不适用于您的情况 - 因此它无法通知任何人有关财产变更的信息.

如果你不喜欢继承ObservableObject- 不要.刚刚实施INotifyPropertyChangedMainViewModel,并没有什么不妥的地方.

  • INotifyPropertyChanged实现可能是某些编程语言(https://en.wikipedia.org/wiki/Mixin)中所谓的Mixin的一个很好的例子.这是一小段行为,可以在没有继承的情况下重复使用.但是C#不支持Mixins,所以你必须一遍又一遍地实现它,或者确实使用继承,即使你感觉不对.然而,无论如何,组合物都不适合.至于构图 - 谷歌的"组合而不是继承",你会发现许多链接与合理的例子(即使在维基百科). (2认同)