2017-06-06 64 views
2

每次當程序在List中添加一個新Item時,我都會通知用戶。來自Collection的C#覆蓋方法<T>

我這樣做:

public class ListDemo<T> : Collection<T> 
{ 
    protected override void InsertItem(int index, T item) 
    { 
     Console.WriteLine("YOU HAVE INSERTED AN ITEM"); 
     base.InsertItem(index, item); 
    } 
} 

我可以從界面的IList繼承ListDemo,但我不希望實現此接口的所有方法。所以我從繼承收藏

現在,我有我的代碼的兩個問題:

我必須通過事件通知用戶嗎?或者我的代碼很好?

如何調用覆蓋方法?像界面一樣?

  // IT WORKS! 
     List<int> _list = new ListDemo<int>(); 
     _list.Insert(0,2); 
     Console.WriteLine(_list[0]); 

此代碼的工作,這對我來說是很奇怪的,因爲當你調用一個接口,你必須用這樣的方式:如果重寫方法就是爲什麼InsertItem

 Collection<int> _list = new ListDemo<int>(); 

,然後當我從我的實例調用該方法時,這僅僅是插入

+1

哦,親愛的......我認爲你有很多關於你的閱讀,關於許多不同的話題(繼承,設計模式,用戶交互...)。我投票結束這個廣泛的問題,因爲你在這裏正式提出了三個問題,所以一個專注的答案不會是一個單一的答案,而是一個包含不同答案的多部分文本。 – grek40

回答

1

InsertItemCollection<T>一個虛擬方法:

protected virtual void InsertItem(
    int index, 
    T item 
) 

請看看here。所以當一個類型繼承Collection<T>時,它可以覆蓋此方法,並且當InsertItem被稱爲被覆蓋的方法時,它將被調用。

另一方面List<T>不會繼承Collection<T>因此沒有任何方法稱爲InsertItem

話雖這麼說,你定義對象如下:

var listDemo = new ListDemo<int>(); 
listDemo.InsertItem(0,2); 

你會實現你想要的,因爲現在listDemo的類型從Collection<int>繼承和你重寫這個方法。

+0

非常感謝!我對你的例子非常瞭解!! ,,, @ grek40如果Christos能回答我的問題,爲什麼要關閉這篇文章...... –

+0

@JoseAviles歡迎您!我很高興我的幫助:) – Christos

+0

@JoseAviles有人能夠給你所需要的信息這一事實與這個問題是否得到完全解答有些無關。我想你問的不僅僅是你真正想知道的事情,所以你現在沒有一個完整的答案就滿意了。答案很好,但它沒有解決你最初要求的一切。 – grek40

2

如果你的實現做到了你想要的,那就沒有問題了。也就是說,已經有一個預定義的類型ObservableCollection<T>,它被記錄爲here,它正是你想要的,即如果集合的內容改變,則提供通知的機制。