没有派生的 ViewModel 但行为相同?

我正在编写一个小型 wpf 桌面应用程序。我的 BaseViewModel 看起来像这样:


public abstract class BaseViewModel : INotifyPropertyChanged, IComparable<BaseViewModel>

{

    public abstract string GetDisplayText();

    public abstract string GetImageName();


    // INotifyPropertyChanged

}

我一直在为 mvvm 寻找最好的 paxis。大多数人说,一个模型有多个 ViewModel,我同意。


因为我希望所有相同类型的 ViewModel 都以相同的方式处理基础知识,所以我认为它们应该相互派生。


public abstract class BaseCustomerVm : BaseViewModel

{

    public abstract string Name { get; set; }

    public abstract int Number { get; set; }

    public abstract bool IsPerson { get; set; }


    public override string GetDisplayText()

    {

        return Name;

    }


    public override string GetImageName()

    {

        if (IsPerson)

            return "Person";

        else

            return "Company";

    }

}


public class Customer1Vm : BaseCustomerVm

{

    public override string Name { get; set; }

    public override int Number { get; set; }

    public override bool IsPerson { get; set; }

}

为了实现这一点,我有以下选择:


版本 1:


public class Customer2Vm : BaseCustomerVm

{

    public override string Name { get; set; }

    public override int Number { get; set; }

    public override bool IsPerson { get; set; }

    // Further Properties

}

版本 2:


public class Customer2Vm : Customer1Vm

{

    // Further Properties

}

在我的搜索中,我读到 ViewModels 不应相互派生。这也在这篇文章中得到了回答。我的问题是:


为什么我不应该以这种方式推导?

在没有继承的情况下处理 sutch基础知识的正确方法是什么?


红颜莎娜
浏览 138回答 2
2回答

慕尼黑5688855

继承不应该成为问题,直到您需要从多个(基本)视图模型继承,即,如果您有几个不同的基本视图模型,它们提供自己的公共基本功能。由于您不能从 C# 中的多个类继承,因此您需要将通用功能分解为可重用的组件,您可以将这些组件注入到您的视图模型中。但是,您能够直接绑定到类中定义的一些常见属性的唯一方法是使用继承,并且从不同的基本视图模型类链继承没有任何问题。事实上,根据我的经验,这是一种非常常见的方法。大多数在视图(使用的类型的Control,FrameworkElement等等)也做到这一点。

至尊宝的传说

至于 ifCustomer2Vm应该从Customer1Vm;&nbsp;我想你想要经典的继承问题:与Customer2Vm有“is-a”关系Customer1Vm吗?只有你知道;&nbsp;但根据名字我会怀疑它。在我看来,它们都应该源自BaseCustomerVm.至于你是否应该使用继承可言;&nbsp;我会说在这里基本上看起来还可以。如果你想避免它(并且更喜欢组合),我建议你让你的虚拟机实现一个ICustomerVm接口来获取属性;然后消费者将使用服务来获取显示文本和图像名称。我可能会坚持你所拥有的(假设它或多或少正是你所展示的)。
打开App,查看更多内容
随时随地看视频慕课网APP