c# - 使用 new 隐藏非虚拟成员的替代方法

标签 c# inheritance

假设我想做这样的事情:

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 ...

    ...
}

但是AddList<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/

相关文章:

c# - 返回通用接口(interface)的工厂类

c# - 当用户没有将完整的 json 传递给 .NET Web API 时怎么办?

javascript - JsonConvert.DeserializeObject 在将字符串转换为日期时抛出错误

c# - 我需要继承两个类(这在 C# 中是不可能的)任何人都可以推荐一种不同的方法吗?

c++ - 继承构造函数

c# - 将 XAML 绑定(bind)到字典

C#.Net - 如何取消从 WebService 中提取数据的 BackgroundWorker

python - 如何使用 __subclasscheck__ 魔术方法?

java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?

c# - 继承 Class1 并实现 Interface1,以防 Class1 已经实现 Interface1