我有这样的代码:
public class Foo
{
public SomeHandler OnBar;
public virtual void Bar()
{
}
}
Foo是一个基类,因此其他类可能会继承它
我希望在调用OnBar
时始终触发Bar()
事件,即使它未在Bar内明确调用。
怎么办呢?
答案 0 :(得分:9)
一种常见的模式是使用非虚拟方法来执行您想要的调用虚方法的方法。子类可以覆盖内部方法以更改功能,但公共方法可以是非虚拟的,始终首先引发事件。
public class Foo
{
public SomeHandler OnBar;
public void Bar()
{
if (OnBar != null)
{
OnBar(this, EventArgs.Empty);
}
BarImpl();
}
protected virtual void BarImpl()
{
}
}
答案 1 :(得分:2)
简短的回答:你做不到。不是微软为您提供的开箱即用。
那就是说,看看.NET中的“面向方面编程”。谷歌,你可能会得到一些有用的东西。
已添加:标准方法是在Bar()
方法中引发事件,然后要求所有派生类调用基本实现。但是你不能强制执行它。
答案 2 :(得分:1)
首先,您提供的代码无法编译 虚函数必须有一个正文。
要确保触发事件,您可以执行以下操作。
public class Foo
{
public SomeHandler OnBar;
public void Bar()
{
OnBar(); (check for nulls)
ProtectedBar();
}
protected virtual ProtectedBar()
{
}
}
答案 3 :(得分:0)
正如Vilx所说,我想更好的方法就是使用面向方面编程。
这可以帮助你处理“纠缠的代码”(即在一个不应该承担这个责任的方法中调用一个事件)和“分散的代码”(即用很多方法调用相同的事件,重复你的代码)问题。
你应该看看postsharp,它有一个免费的社区版。