2014-03-03 73 views
0

我有一個父類:的IEnumerable <>實例化爲名單<>,但不能添加元素

public abstract class ObjectCollection 
{ 
    protected IEnumerable<MyObject> Objects; 

    public ObjectCollection() 
    { 
     LoadObjects(); 
    } 
} 

而且從它繼承一個子類:從MyObject

public class PublicationCollection : ObjectCollection 
{ 
    public PublicationCollection() : base() { } 

    protected override void LoadObjects() 
    { 
     this.Objects = new List<PublicationObject>(); 
     this.Objects.Add(new PublicationObject("Example")); 
    } 
} 

PublicationObject繼承。

this.Objects.Add(new PublicationObject("Example"));拋出一個錯誤,因爲編譯器將它視爲IEnumerable,儘管我已將它實例化爲List<>。我怎樣才能達到我想要的?

+5

*爲什麼*您是否在'IEnumerable '中輸入了'Objects',因爲您需要一個允許添加項目的類型實例? –

+0

將其列表或將其轉換爲列表。 –

+0

因爲當我在父類中使用列表時,我收到了一個轉換錯誤。 –

回答

2

對象被聲明爲IEnumerable的。 雖然您使用列表<>將其初始化爲編譯器,但它仍然是IEnumerable。

您可以修復它在你的代碼提供的示例:

protected override void LoadObjects() 
    { 
     var list = new List<PublicationObject>(); 
     list.Add(new PublicationObject("Example")); 
     this.Objects = list; 
    } 

外部類的客戶端將不知道該財產是一個具體的名單,將無法使用目錄的方法<>除非鑄造列出<>

ObjectCollection oc = ... 
((List<<PublicationObject>) oc.Objects).Add(...); 

既然你命名班級爲收藏,我懷疑你要允許客戶直接追加項目名單。我專門的方法Add()是去這裏的方法。現在可能並不明顯,但將在未來安全:-)

命名錶明這是一個集合,所以它會更好地讓你的ObjectCollection實現ICollection。由於命名您的班級的未來用戶期望集合約定。

1

因爲this.Objects暴露作爲IEnumerable<T>,所以它可能比列表中的其他東西。

如果您知道這是你可以只投它一個列表:

((List<PublicationObject>)this.Objects).Add(new PublicationObject("Example")); 

,但你所冒的風險,如果它不名單,並在運行時拋出異常。

因爲這是所有相同的方法只需要創建一個List變量並使用它:

protected override void LoadObjects() 
{ 
    var list = new List<PublicationObject>(); 
    list.Add(new PublicationObject("Example")); 
    this.Objects = list 
} 

或者更好,如果你需要它被暴露列表(或某些集合,您可以添加到),其聲明爲一些其它類型的,如ICollection<MyObject>

protected ICollection<MyObject> Objects; 
0

您似乎需要在PublicationCollection.LoadObjects()方法中向Objects添加項目的功能。因此,首先存儲到您的列表的引用在適當類型的變量,後來該變量分配給Objects領域:

protected override void LoadObjects() 
{ 
    var objectsList = new List<PublicationObject>(); 
    objectsList.Add(new PublicationObject("Example")); 
    this.Objects = objectsList; 
} 

類的接口依然這樣相同(即Objects仍然將是一個IEnumerable<PublicationObject>)和ObjectCollection的其他子類仍然可以將類型實例分配給Objects,這些實例不會實現任何更具體的接口,如果這正是您想要實現的。

相關問題