【发布时间】:2018-05-29 14:54:25
【问题描述】:
我正在编写一个小型 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 不应该从彼此派生。 this post 也回答了这个问题。我的问题是:
- 我为什么不应该以这种方式推导?
- 在没有继承的情况下处理 sutch basics 的正确方法是什么?
【问题讨论】:
-
“在我的搜索中,我读到 ViewModels 不应该相互派生” -- 在我的搜索中,我读到登月是假的。我会应用通常的规则来决定是否编写子类。
-
没有什么说视图模型不应该从另一个视图模型派生。有复合重用原则,但这是另一回事:en.wikipedia.org/wiki/Composition_over_inheritance
-
顺便说一下,
GetDisplayText和GetImageName应该是抽象属性DisplayText和ImageName,而不是方法。您很可能希望能够绑定它们,即使没有,它们通常也是一种属性。 -
扩展我的第一条评论:您找到的答案是说,如果您应用通常的常识规则,您很少会发现有任何充分理由让您的视图模型层次结构更深的情况比
AbstractViewModelBase->FooViewModel。我没有发现它像他建议的那样罕见,而且我已经在工作中使用 WPF 好几年了。逐案使用您自己的判断。
标签: c# wpf inheritance design-patterns mvvm