2010-07-11 22 views
5

我有这样的代码:如何在函数调用时自动调用事件?

public class Foo 
{ 
    public SomeHandler OnBar; 

    public virtual void Bar() 
    { 
    } 
} 

foo是一个基类,为此其他类可能继承它。
我想在调用Bar()时总是会触发OnBar事件,即使它没有在Bar中显式调用。
怎么办?

回答

9

一个常见的模式是有一个非虚拟的方法,将做你想要的,调用虚拟方法。子类可以重写内部方法来改变功能,但公共方法可以是非虚拟的,总是首先引发事件。

public class Foo 
{ 
    public SomeHandler OnBar; 

    public void Bar() 
    { 
     if (OnBar != null) 
     { 
      OnBar(this, EventArgs.Empty); 
     } 
     BarImpl(); 
    } 

    protected virtual void BarImpl() 
    { 
    } 
} 
+0

基本上模板方法模式的实现+ 1 – DanP 2010-07-11 15:07:45

+0

所以这是最好的方法?在C++中,我将使用bind()从事件调用函数和原始函数中创建一个新函数。 – 2010-07-11 15:18:14

2

简答:你不能。不是微软为您提供的开箱即用功能。

这就是说,看看.NET中的“面向方面的编程”。谷歌,你可能会得到一些有用的东西。

加入:标准方法是在Bar()方法中引发事件,然后要求所有派生类调用基本实现。但是你不能执行它。

1

首先您提供的代码不会编译。
虚拟功能必须有一个主体。

为了确保事件被解雇,你可以这样做。

public class Foo 
{ 
    public SomeHandler OnBar; 

    public void Bar() 
    { 
    OnBar(); (check for nulls) 
    ProtectedBar(); 
    } 

    protected virtual ProtectedBar() 
    { 
    } 
} 
+0

你是对的。然而,在这种情况下这并不重要。这只是为了证明该功能可以被覆盖。我不知道你为什么被低估。我致力于平衡。 – 2010-07-11 15:11:32

+1

您提供的代码不会编译 - 您的虚拟函数没有返回类型,您的评论也不是评论。 – 2010-07-11 15:14:29

+0

我想有些徽章收藏家低估了我的徽章。 :) – 2010-07-11 15:14:37

0

正如Vilx-说,我想更好的办法做这样的东西是使用面向方面的编程。

这会帮助你解决“纠缠的代码”(即在一个不应该有这个责任的方法中调用一个事件)和“分散代码”(即在很多方法中调用同一个事件,复制你的代码)问题。

你应该看看postsharp,它有一个免费的社区版。

相关问题