2017-06-06 66 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,它正是你想要的,即如果集合的内容改变,则提供通知的机制。