泛型中的继承是否与具体类和抽象类的工作方式相同?
本文关键字:抽象类 工作 方式相 继承 是否 泛型 | 更新日期: 2023-09-27 17:53:46
我有三个类:Post
, Post<T>
和WallPost
。
Post是一个抽象类,表示博客文章的属性,如name
, text
, user
等。
第二个抽象类是Post<T>
, post的通用版本,所以我可以实现一个通用的GetChildren(T Post)
来获得post
的孩子并建立一个层次结构列表。
第三个类是具体的' WallPost
',它是用户配置文件的特定帖子。
public class WallPost : Post<WallPost>
最后是Member
类,其中包含WallPosts
的集合。
我编写了一个控件,该控件接受一系列帖子并将其显示在树中。这个控件的一个属性是
public IList<Post<Post>> Posts
{
get; set;
}
(我使用泛型,因为我需要得到孩子,GetChildren(T Post)
)。并且我将类型参数设置为Post,因此它将接受任何继承自Post, wallpost, blogpost等的类
现在我的问题是,我想把IList<WallPost>
类型的WallPosts
的用户集合传递给函数,我得到这个错误:
Unable to cast object of type 'NHibernate.Collection.Generic.
PersistentGenericBag`1[BO.WallPost]'
to type 'System.Collections.Generic.IList`1[BO.Post`1[BO.Post]]'.
我猜这是因为尽管你可以写Post p = new WallPost()
之类的东西,但你不能写List<Post> posts = new List<WallPost>()
无论如何,我完全困惑了,我希望我把自己说清楚了。
提前谢谢你
E注:
你试图以一种不类型安全的方式使用泛型协方差。
如果你写
会发生什么?List<WallPost> wallList = new List<WallPost>();
List<Post> pList = wallList;
pList.Add(new OtherPost()); //Not a WallPost!
您只能使用只读接口(IEnumerable<Post>
)或数组。
你需要检查你的NHibernate映射。NHibernate把你的集合当作一个包,而不是一个列表。
从NHibernate的角度来看,列表可能不是合适的选择。列表为你提供了对集合成员的基于索引的访问,但是你必须在你的表中有一个列表索引列,以便NHibernate将它映射为列表。
你应该检查一下NHibernate的集合映射选项,然后选择一个最适合你的情况(set, bag, list等)
为了工作,您可以使用:
public IList<Post<WallPost>> Posts
{
get; set;
}
和赋值时的类型转换:
bla.Posts = posts.Cast<Post<WallPost>>();