![](/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.