我有这样的代码:如何在函数调用时自动调用事件?
public class Foo
{
public SomeHandler OnBar;
public virtual void Bar()
{
}
}
foo是一个基类,为此其他类可能继承它。
我想在调用Bar()
时总是会触发OnBar
事件,即使它没有在Bar中显式调用。
怎么办?
我有这样的代码:如何在函数调用时自动调用事件?
public class Foo
{
public SomeHandler OnBar;
public virtual void Bar()
{
}
}
foo是一个基类,为此其他类可能继承它。
我想在调用Bar()
时总是会触发OnBar
事件,即使它没有在Bar中显式调用。
怎么办?
一个常见的模式是有一个非虚拟的方法,将做你想要的,调用虚拟方法。子类可以重写内部方法来改变功能,但公共方法可以是非虚拟的,总是首先引发事件。
public class Foo
{
public SomeHandler OnBar;
public void Bar()
{
if (OnBar != null)
{
OnBar(this, EventArgs.Empty);
}
BarImpl();
}
protected virtual void BarImpl()
{
}
}
简答:你不能。不是微软为您提供的开箱即用功能。
这就是说,看看.NET中的“面向方面的编程”。谷歌,你可能会得到一些有用的东西。
加入:标准方法是在Bar()
方法中引发事件,然后要求所有派生类调用基本实现。但是你不能执行它。
首先您提供的代码不会编译。
虚拟功能必须有一个主体。
为了确保事件被解雇,你可以这样做。
public class Foo
{
public SomeHandler OnBar;
public void Bar()
{
OnBar(); (check for nulls)
ProtectedBar();
}
protected virtual ProtectedBar()
{
}
}
你是对的。然而,在这种情况下这并不重要。这只是为了证明该功能可以被覆盖。我不知道你为什么被低估。我致力于平衡。 – 2010-07-11 15:11:32
您提供的代码不会编译 - 您的虚拟函数没有返回类型,您的评论也不是评论。 – 2010-07-11 15:14:29
我想有些徽章收藏家低估了我的徽章。 :) – 2010-07-11 15:14:37
正如Vilx-说,我想更好的办法做这样的东西是使用面向方面的编程。
这会帮助你解决“纠缠的代码”(即在一个不应该有这个责任的方法中调用一个事件)和“分散代码”(即在很多方法中调用同一个事件,复制你的代码)问题。
你应该看看postsharp,它有一个免费的社区版。
基本上模板方法模式的实现+ 1 – DanP 2010-07-11 15:07:45
所以这是最好的方法?在C++中,我将使用bind()从事件调用函数和原始函数中创建一个新函数。 – 2010-07-11 15:18:14