调用方法后调用事件

时间:2015-04-02 21:37:10

标签: c# events delegates

我实际上遇到了一个奇怪的问题。我尝试基于Hashset类创建一个新的Set类。

public delegate void ChangedEventHandler();
class Set<T> : HashSet<T>
{

    event ChangedEventHandler Added; 

    public bool Add(T item) 
    {
        bool answer = base.Add(item);
        Added?(); //or Added?.Invoke()
        return answer;
    }

}

我希望在调用Add方法后执行一些函数。以上代码说Add已经在基类中实现了,但它不是虚拟的。我无法覆盖它。

其实我想得到这样的结果:

Set<int> numbers = new Set<int>();
numbers.Added += SumNumbers;
numbers.Added += PrintNumbers;
numbers.Add(2) //Outputs 2
numbers.Add(4) //Outputs 6


//somewhere in this class
public int SumNumbers() {...}
public void PrintNumbers() {...}

坦率地说,我不需要具有不同语法结构的函数,但是如果它们存在则还有另一个问题。

3 个答案:

答案 0 :(得分:1)

这通常是我使用的模式:

public class Set<T> : HashSet<T>
{
    private event ChangedEventHandler Added;

    public new bool Add(T item)
    {
        bool answer = base.Add(item);
        OnAdded();
        return answer;
    }

    private void OnAdded()
    {
        if (Added == null)
            return;

        Added();
    }
}

答案 1 :(得分:1)

只需添加&#34; new&#34;方法定义的关键字,因为编译器警告您,您正在隐藏基本实现:

public new bool Add(T item) 
{
    bool answer = base.Add(item);

    if(Added != null)
    {
        Added();
    }

    return answer;
}

将处理程序附加到事件的正确语法也是没有&#34;()&#34; (你传递方法,而不是打电话):

numbers.Added += SumNumbers;
numbers.Added += PrintNumbers;

//somewhere in this class
public int SumNumbers() {...}
public void PrintNumbers() {...}

答案 2 :(得分:0)

如果它不是virtual,并且您仍然希望为该方法添加新的实现,请在方法中添加"new"运算符以隐藏基类实现,如下所示

public new bool Add(T item)