![](/img/trans.png)
[英]Inheritance question - declaring abstract and concrete versions of the same property
[英]Does inheritance in generics work the same way as concrete and abstract classes, InvalidCaseException
我有三个类: Post
、 Post<T>
和WallPost
。
Post 是一个抽象的 class 表示具有name
、 text
、 user
等属性的博客文章。
第二个抽象 class 是Post<T>
, post 的通用版本,因此我可以实现通用GetChildren(T Post)
来获取post
的子级并构建层次结构列表。
第三个 class 是具体的“ WallPost
”,它是针对用户个人资料的特定帖子。
public class WallPost : Post<WallPost>
最后是一个包含 WallPosts 集合的Member
WallPosts
。
我编写了一个控件,它接收一组帖子并将其显示在树中。 我对该控件的属性之一是
public IList<Post<Post>> Posts
{
get; set;
}
(我使用 generics 因为我需要带孩子GetChildren(T Post)
)。 我将类型参数设置为 Post,因此它将接受任何继承自 post、wallpost、blogpost 等的 class
现在我的问题是我想将用户的IList<WallPost>
类型的WallPosts
集合传递给 function 并且我收到此错误:
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>()
无论如何,我完全感到困惑,我希望我说清楚了。
先感谢您
乙
PS 我使用 NHibernate 并没有提到任何包。
您正在尝试以非类型安全的方式使用泛型协方差。
如果你写会发生什么
List<WallPost> wallList = new List<WallPost>();
List<Post> pList = wallList;
pList.Add(new OtherPost()); //Not a WallPost!
您只能使用只读接口 ( IEnumerable<Post>
) 或 arrays。
您需要检查您的 NHibernate 映射。 NHibernate 将您的收藏视为袋子而不是列表。
从 NHibernate 的角度来看,列表可能不是合适的选择。 列表为您提供对集合成员的基于索引的访问,但您的表中必须有一个列表索引列,以便 NHibernate 到 map 将其作为列表。
您可能应该查看 NHibernate 集合映射选项并选择最匹配您的情况的一个(集合、包、列表等)。
为了工作,您可以使用:
public IList<Post<WallPost>> Posts
{
get; set;
}
并在分配时进行转换:
bla.Posts = posts.Cast<Post<WallPost>>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.