如何使用项目列表(继承自摘要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){
...
}
这是我遇到的问题的一个简短示例
我有两个抽象的 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){
...
}