如何使用项目列表(继承自摘要class)作为其摘要class?

How to use a list of items (heriting from an abstract class) as its abstract class?

这是我遇到的问题的一个简短示例

我有两个抽象的 classes EntityAbs 和 ListEntityAbs :

public abstract class EntityAbs {
    //Save itself in a Database
    public abstract int SaveEntity();
}
public abstract class ListEntitiesAbs<T> where T : EntityAbs {
    protected List<T> InnerList;

    //Save each values in a Database
    public virtual int SaveEntities()
    {
        return InnerList.Sum(entity => entity.SaveEntity());
    }
}

继承 EntityAbs 并获得自己的 ListEntities 的多个 classes(带有 class 命名项的示例):

public class Item : EntityAbs {
    public override int SaveEntity()
    {
        // Implements here how I save it
    }
}
public class Items : ListEntitiesAbs<Item>, IList<Item> { 
    // Has specific class stuff in it
}

现在,我想将每个 ListEntitiesAbs 保存在其他地方 我的数据库中

public int Save(params ListEntitiesAbs<EntityAbs>[] lists)
{
    for(int i = 0; i < lists.Length; i++)
        lists[i].SaveEntities();
}

Items items = new Items();
// add items 
int result = Save(items);

但是,项目(或我在此处添加的任何其他列表)通过 Visual Studio 显示错误,我在这里不明白为什么。 错误说它 Cannot convert from Items to ListEntitiesAbs<EntityAbs>,但 Items 继承自 ListEntitiesAbs 和 Item 来自 EntityAbs..

我错过了什么吗?我尝试过使用 ListEntityAbs 或使用 Cast<> 进行转换,但都不适合

感谢任何帮助,因为我什至不确定这种行为是否真的可能

ListEntitiesAbs<T> 不是 covariant。这意味着 ListEntitiesAbs<Item> 不是,也不能简单地转换为 ListEntitiesAbs<EntityAbs>.

选项 1:使 Save 通用

public int Save<T>(params ListEntitiesAbs<T>[] lists) where T:EntityAbs 
{
    for(int i = 0; i < lists.Length; i++)
       lists[i].SaveEntities();
}

选项 2:非通用接口。您也可以制作协变接口,但在这种特殊情况下似乎不需要。

public interface IListEntitiesAbs {
    public int SaveEntities();
}
public int Save(params IListEntitiesAbs[] lists){
    ...
}