【问题标题】:Composition instead of inheritance组合代替继承
【发布时间】:2016-05-04 08:03:50
【问题描述】:

我正在开发一个带有 MVVM 模式的 WPF,.NET Framework 4.6.1。和 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));
    }
}

还有:

public class MainViewModel : ObservableObject
{
    private string statusPrinter;

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

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

但是当我使用组合时,ObservableObject 中的public event PropertyChangedEventHandler PropertyChanged; 似乎有问题。问题在于 XAML 链接时。

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

【问题讨论】:

  • 这是一个很奇怪的要求。你为什么不想在这里继承?
  • @Dennis 我读了Microsoft .NET: Architecting Applications for the Enterprise, Second Edition 这本书,它谈到了避免继承。
  • 为了你未来的理智,用nameof语句替换那些硬编码的字符串!如果您的目标是 .NET 4.6.1,那么使用 C# 6 肯定没问题

标签: c# inheritance mvvm object-composition


【解决方案1】:

你不能在这里使用构图,至少不能以你呈现的方式。当某些东西想要订阅MainViewModel 对象的属性更改通知时 - 它会首先检查MainViewModel 是否实现INotifyPropertyChanged。在你的情况下它不是 - 所以它不能通知任何人关于属性的变化。

如果您不喜欢从 ObservableObject 继承 - 不要。在MainViewModel中实现INotifyPropertyChanged就行了,没有错。

【讨论】:

  • 谢谢。我考虑了您的解决方案,如果我使用它,我将需要在每个 ViewModel 类上实现 INotifyPropertyChanged。我读了Microsoft .NET: Architecting Applications for the Enterprise, Second Edition 这本书,它谈到了避免继承和使用组合。但我认为我可以在可能的情况下使用组合,但事实并非如此。
  • INotifyPropertyChanged 实现可能是某些编程语言中所谓的 Mixin 的一个很好的例子 (en.wikipedia.org/wiki/Mixin)。这是可以在没有继承的情况下重用的一小部分行为。但是 C# 不支持 Mixins,所以你必须一遍又一遍地实现它,或者确实使用继承,即使你觉得它不对。然而,构图无论如何都不适合这里。至于组合 - 谷歌“组合而不是继承”,你会发现很多链接都有合理的例子(甚至在维基百科中)。
猜你喜欢
  • 2019-10-06
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
相关资源
最近更新 更多