gpt4 book ai didi

c# - 覆盖子类中的通用 IEnumerable 接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:48 26 4
gpt4 key购买 nike

我正在开发一个 ORM。我希望我的集合对象能够在 Linq 中使用。为了清楚起见,我在这里编写的类进行了简化。包含实体对象的数组位于 CollectionBase 类中。

class EntityBase
{
public int fieldBase;
}

class EntityChild : EntityBase
{
public int fieldChild;
}

class CollectionBase : IEnumerable<EntityBase>
{
protected EntityBase[] itemArray;

//implementing the IEnumerable<EntityBase> is here. GetEnumerator method returns IEnumerator<EntityBase>

}

class CollectionChild : CollectionBase, IEnumerable<EntityChild>
{
public CollectionChild()
{
itemArray = new EntityChild[5]; //this is just an example.
}
//implementing the IEnumerable<EntityChild> is here. GetEnumerator method returns IEnumerator<EntityChild
}

我尝试了几种方法。

如果 CollectionChild 不扩展 IEnumerable,则在此代码中无法访问 EntityChild 自己的字段:

var list = from c in childCollection
where c.fieldChild == 1; // c references to an EntityBase object.
select c;

如果 CollectionChild 扩展 IEnumerable,则甚至不可能在 Linq 中使用 CollectionChild。

发生错误:“找不到源类型‘Generic_IEnumerableSample.CollectionChild’的查询模式的实现。找不到‘Where’。考虑明确指定范围变量‘childCollection’的类型。”

我试图找到一些方法来继承 CollectionChild 中的类(在实现 IEnumerator 的 CollectionBase 中)作为 IEnumerator 类。它不起作用,因为不可能覆盖返回不同枚举器的方法。

仍然可以不为基础集合类实现 IEnumerator 接口(interface),而为所有子集合类实现。但这似乎是一种非 OODesign 方法。

我必须更改我的设计,还是有任何方法可以完全覆盖 IEnumerable 方法或效果?

最佳答案

这样调整你的类(class):

public class CollectionBase<T> : IEnumerable<T>
where T: EntityBase
{
protected EntityBase[] itemArray;

//implementing the IEnumerable<EntityBase> is here. GetEnumerator method returns IEnumerator<EntityBase>

}

这样,基类就会知道底层类型。

HTH.

关于c# - 覆盖子类中的通用 IEnumerable 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5372248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com