从非泛型接口继承泛型类

时间:2017-02-06 11:27:49

标签: c# .net generics inheritance

我有模型类和接口:

A
 [[-1.086  0.997]
 [ 0.283 -1.506]
 [-0.579  1.651]]
A_linv.dot(A)
 [[ 1. -0.]
 [ 0.  1.]]

我有ViewModel接口:

public interface IEntity
{
    int ID { get; set; }
}

public class Entity : IEntity
{
    public int ID { get; set; }
}

我需要一个ViewModel基类:

public interface IEntityListViewModel
{
    RangeObservableCollection<IEntity> Items { get; set; }
    IEntity SelectedItem { get; set; }

    void LoadItems();
}

当然,编译器需要实现public abstract class EntityListViewModel<T> : IEntityListViewModel where T : IEntity { public RangeObservableCollection<T> Items { get; set; } public T SelectedItem { get; set; } public EntityListViewModel() { Items = new RangeObservableCollection<T>(); } protected abstract List<T> GetEntities(); public void LoadItems() { var lst = GetEntities(); Items.ReplaceRange(lst); } }

我能做到:

IEntityListViewModel.Items

但我还有另一堂课:

public interface IEntityListViewModel<T> where T : IEntity
{
    RangeObservableCollection<T> Items { get; set; }
    T SelectedItem { get; set; }

    void LoadItems();
}

我需要public abstract class UserControlBase : UserControl { public IEntityListViewModel VM { get; set; } public virtual void UserControl_Loaded(object sender, RoutedEventArgs e) { VM.LoadItems(); } } 因为我的ViewModel有很多事件,而UserControlBase我想订阅它们。 我能做到:

UserControlBase

然后我必须public IEntityListViewModel<T> VM { get; set; } 。我不喜欢这个。

如何从UserControlBase<T>继承EntityListViewModel<T>?还是有其他解决方案吗?

2 个答案:

答案 0 :(得分:1)

你可以做这样的事情

RangeObservableCollection<IEntity> IEntityListViewModel.Items
    {
        get
        {
            return new RangeObservableCollection<IEntity>(Items.Cast<IEntity>());
        }

        set
        {
            Items = new RangeObservableCollection<T>(value.Cast<T>());
        }
    }

    IEntity IEntityListViewModel.SelectedItem
    {
        get
        {
            return SelectedItem;
        }

        set
        {
            SelectedItem = (T)value;
        }
    }

为了避免每次需要更改为IEnumerable<T>时都必须创建新的RangeObservableCollection。另一个问题是,始终进行强制转换可能会花费很多。此外,你没有提到将在前端绑定哪个集合(我假设你将要做的事情),基于可以进行一些优化。

答案 1 :(得分:0)

我有点混淆这个问题,但我会试着回答。

  

如何从IEntityListViewModel继承EntityListViewModel

基于代码,我认为这就是你想要的东西

public abstract class EntityListViewModel<T> where T : IEntity, EntityListViewModel

这是实现目标的最简单方法,而不会强迫您在UserControlBase类中实现泛型。