假设以下类:
public interface ITabViewModel<T> {}
public class FooTabViewModel : ITabViewModel<FooTabViewModel> {}
public class BarTabViewModel : ITabViewModel<BarTabViewModel> {}
public class MainWindowViewModel
{
private readonly ObservableCollection<?> _tabs;
public MainWindowViewModel(
ITabViewModel<FooTabViewModel> fooTabViewModel
ITabViewModel<BarTabViewModel> barTabViewModel)
{
}
public ObservableCollection<?> Tabs
{
get { return _tabs; }
}
}
MainWindowViewModel
包含一个选项卡列表(例如工作区),这些选项卡将绑定到视图并与XAML一起显示。
我遇到的问题是我不知道要为ObservableCollection
提供什么样的通用类型。我可以给它一种对象,但我不是很喜欢这个想法。我意识到我可以创建IFooTabViewModel
和IBarTabViewModel
,但是创建一个每个TabViewModel
都可以使用的通用接口似乎更有意义。
我可能会看到另一种设计吗?
答案 0 :(得分:3)
您需要解决两个问题:
ITabViewModel<T>
获得什么价值?Tabs
属性?我的猜测是Tabs
向UI公开了一个视图模型列表,因此它可以为每个模板创建一个特定于视图的选项卡表示。在这种情况下,您不需要通用类型的编译时间,因为空ITabViewModel<T>
指出,除了包含在Tabs
之外,它们没有任何共同点。
如果猜测正确,我会说你可以完全取消ITabViewModel<T>
类型,直接在构造函数中接受FooTabViewModel
和BarTabViewModel
,并使Tabs
成为输入ObservableCollection<object>
。
我基于这样一个事实,即你永远不会使用ITabViewModel<T>
类型,并且(显然)正在寻找一些通用接口来组合一组其他不相关的类。这可以通过使用object
来清晰地表示,而不是发明一个不抽象任何东西的抽象。