C# ObservableCollection的类型<;T>;保存通用接口

C# ObservableCollection的类型<;T>;保存通用接口,c#,generics,interface,dependency-injection,C#,Generics,Interface,Dependency Injection,假设以下类别: public interface ITabViewModel<T> {} public class FooTabViewModel : ITabViewModel<FooTabViewModel> {} public class BarTabViewModel : ITabViewModel<BarTabViewModel> {} public class MainWindowViewModel { private readonl

假设以下类别:

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; }
    }
}
公共接口ITabViewModel{}
公共类FooTabViewModel:ITabViewModel{}
公共类BarTabViewModel:ITabViewModel{}
公共类MainWindowViewModel
{
专用只读可观察收集选项卡;
公共主窗口视图模型(
ITabViewModel fooTabViewModel
ITabViewModel barTabViewModel)
{
}
公共可观察集合选项卡
{
获取{return\u tabs;}
}
}
MainWindowViewModel
包含一个选项卡列表(例如工作空间),这些选项卡将绑定到视图并用XAML显示

我遇到的问题是,我不知道将什么泛型类型赋予
ObservableCollection
。我可以给它一种物体,但我不太喜欢这个想法。我意识到我可以创建
IFooTabViewModel
IBarTabViewModel
,但是创建每个
TabViewModel
都可以使用的通用接口似乎更有意义


我是否应该考虑另一种设计?

有两个问题需要解决:

  • 如果
    ITabViewModel
    没有任何成员,您打算从中获得什么价值
  • 您计划如何使用
    选项卡
    属性
  • 我的猜测是,
    Tabs
    向UI公开了一个视图模型列表,这样它就可以为每个视图创建特定于视图的选项卡表示。在这种情况下,您不需要公共类型编译时,因为正如空的
    ITabViewModel
    指出的那样,它们除了包含在
    选项卡中之外没有任何共同之处

    如果这个猜测是正确的,我会说您可以完全消除
    ITabViewModel
    类型,直接在构造函数中接受
    FooTabViewModel
    BarTabViewModel
    ,并使
    Tabs
    类型为
    observedcollection


    我之所以做出这些决定,是因为您从未使用
    ITabViewModel
    类型,并且(显然)正在寻找一些公共接口来对一组其他方面不相关的类进行分组。这可以通过使用
    对象
    来清晰地表示,而不是发明一个不会把任何东西抽象掉的抽象。

    你不能使用“ITabViewModel”作为泛型吗?所以你想能够将
    FooTableViewModel
    BarTableViewModel
    放在同一个可观察的集合中?为什么不简单地让
    ITabViewModel
    继承
    ITabViewModel
    ,然后使用
    observedcollection
    ?然后,您可以在实现接口时忽略泛型类型。
    ITabViewModel
    似乎是一个令人生畏的答案。如果您不想继承像@Tejs建议的新接口,您可以只使用ITabViewModelAre来实现我看到的那些递归泛型实现?如果我说您没有成功,那我是在撒谎。