输入ObservableCollection <t>以保存通用接口</t>

时间:2011-06-01 14:49:17

标签: c# generics interface dependency-injection

假设以下类:

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提供什么样的通用类型。我可以给它一种对象,但我不是很喜欢这个想法。我意识到我可以创建IFooTabViewModelIBarTabViewModel,但是创建一个每个TabViewModel都可以使用的通用接口似乎更有意义。

我可能会看到另一种设计吗?

1 个答案:

答案 0 :(得分:3)

您需要解决两个问题:

  1. 如果没有任何成员,您打算从ITabViewModel<T>获得什么价值?
  2. 您打算如何使用Tabs属性?
  3. 我的猜测是Tabs向UI公开了一个视图模型列表,因此它可以为每个模板创建一个特定于视图的选项卡表示。在这种情况下,您不需要通用类型的编译时间,因为空ITabViewModel<T>指出,除了包含在Tabs之外,它们没有任何共同点。

    如果猜测正确,我会说你可以完全取消ITabViewModel<T>类型,直接在构造函数中接受FooTabViewModelBarTabViewModel,并使Tabs成为输入ObservableCollection<object>

    我基于这样一个事实,即你永远不会使用ITabViewModel<T>类型,并且(显然)正在寻找一些通用接口来组合一组其他不相关的类。这可以通过使用object来清晰地表示,而不是发明一个不抽象任何东西的抽象。