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来实现我看到的那些递归泛型实现?如果我说您没有成功,那我是在撒谎。