假设我想做这样的事情:
class Foo
{
public event BarHandler Bar;
...
}
class FooList<T> : List<T> where T : Foo
{
public override void Add(T item)
{
item.Bar += Bar_Handler;
base.Add(item);
}
private void Bar_Handler ...
...
}
但是Add
在 List<T>
不是虚拟的,所以我不能使用 override
, 我将不得不求助于 new
反而。然而,这不提供多态性,我担心引用 FooList
可能会引入细微的错误。简单地 List
,这将导致我的事件处理程序未被添加。
我目前的具体情况是:我想继承 ObservableCollection
对于实现 INotifyPropertyChanged
的项目,并在添加/删除这些项目时添加/删除事件处理程序。然后我提供一个事件,如果集合中的任何项目发生变化,就会引发该事件。
我想要一个针对我的特定问题以及潜在的一般问题的解决方案,因为这是我偶然发现的几次,来自 Java 背景。
最佳答案
而不是扩展 List<T>
你可以实现 IList<T>
接口(interface)并保持内部List<T>
成员变量。这样你就不会破坏现有的 List<T>
功能并仍然实现与 List<T>
相同的接口(interface).
例子:
class FooList<T> : IList<T> where T : Foo
{
private List<T> m_internalList = new List<T>();
public void Add(T item)
{
item.Bar += Bar_Handler;
m_internalList.Add(item);
}
// other methods
}
关于c# - 使用 new 隐藏非虚拟成员的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27794707/