泛型中的继承是否与具体类和抽象类的工作方式相同?

本文关键字:抽象类 工作 方式相 继承 是否 泛型 | 更新日期: 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>>();