【问题标题】:How to use a list of items (heriting from an abstract class) as its abstract class?如何使用项目列表(继承自抽象类)作为其抽象类?
【发布时间】:2021-05-27 02:43:09
【问题描述】:

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

我有两个抽象类 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&lt;EntityAbs&gt;,但Items继承自ListEntitiesAbs和Item继承自EntityAbs..

我错过了什么吗?我尝试过投射为 ListEntityAbs 或使用 Cast 但不适合

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

【问题讨论】:

    标签: c# generics abstract-class abstraction


    【解决方案1】:

    ListEntitiesAbs&lt;T&gt; 不是 covariant。这意味着ListEntitiesAbs&lt;Item&gt; 不是,也不能简单地转换为ListEntitiesAbs&lt;EntityAbs&gt;

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

    【讨论】:

    • 选项 1 正是我所需要的,我很惭愧不去想它。它解决了我的兼容性问题,但是如果我在调用Save() 方法时添加多个列表,params 似乎不起作用,您还有其他线索吗?
    • @arrcival params 应该适用于泛型方法。猜测是类型不匹配,即您试图调用Save(new ListEntitiesAbs&lt;Item&gt;(), new ListEntitiesAbs&lt;EntityAbs&gt;()) 由于上述原因,这将不起作用。如果这是一个问题,请改用选项 2。
    • 这是一个基于我的示例 dotnetfiddle.net/eqPglu 的 .NET 小提琴。我想这些解决方案都不起作用,我将不得不选择选项 2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2015-04-07
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多