2014-03-03 75 views
0

我有下面的類:實例化父類的列表與子類

public abstract class ParentCollection 
{ 
    public List<ParentObject> MyList { get; set; } 

    public ParentCollection(){} 
} 

ParentObject具有從它繼承,ChildObject一個子類。 ParentCollection還具有以下亞類:

public class ChildCollection : ParentCollection 
{ 
    public ChildCollection() : base() 
    { 
     this.MyList = new List<ChildObject>(); 
    } 

    private void Filter() 
    { 
     this.MyList = this.Objects.Where(p => p.Age > 18).ToList(); 
    } 
} 

this.MyList = new List<ChildObject>();是扔一個Cannot implicitly convert type errorFilter()方法也拋出一個類型錯誤。

我的理解是,父對象列表應允許使用子對象實例化,因爲該對象從父對象繼承。

+0

製作'ParentCollection'公共 – Muctadir

+1

你應該閱讀有關[協變和逆變(HTTP://博客。 msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx)。 –

回答

2

的這裏的問題是,雖然ChildObject可以爲ParentObject孩子,List<ChildObject>不是List<ParentObject>一個孩子。 List<ChildObject>List類型的對象,因此是List<ParentObject>

您可以像這樣更改ParentCollection以達到您想要的效果。

abstract class ParentCollection 
{ 
    public IEnumerable<ParentObject> MyList { get; set; } 

    public ParentCollection() { } 
} 

您可能還需要尋找到Covarience and Contravarience.

+0

我沒有給ParentObject和ChildObject提供代碼。 ChildObject是ParentObject的一個子項。 –

+0

這並不意味着列表是List Muctadir

+0

的子項那麼是否有辦法實現我之後的繼承類型? –

1

的問題是,允許通過基本接口派生類型的列表,寫訪問可以讓你添加錯誤類型的對象列表。

不過,如果你只需要列舉的讀訪問列表,你可以這樣做:

public abstract class ParentCollection 
{ 
    public IEnumerable<ParentObject> MyList 
    { 
     get; 
     set; 
    } 

    public ParentCollection() 
    { 
    } 
}