微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用项目列表从抽象类继承作为其抽象类?

如何解决如何使用项目列表从抽象类继承作为其抽象类?

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

我有两个抽象类 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 的多个类(一个名为 Item 的类的示例):

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){
    ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。