Seb*_*ier 6 c# events inheritance
从来没有见过这个.这是样本:
using System;
namespace Testing
{
public class Test
{
public event Action ActionRequired;
}
public class ChildTest : Test
{
public void DoSomething()
{
if (this.ActionRequired != null)
this.ActionRequired();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,错误是我只能从基类访问事件.
四处逛逛并不困难(向基类添加一个受保护的方法,既检查事件的调用又从子类调用该方法),但我真的想知道这个限制背后的想法是什么?
干杯,
SEBI
Ed *_* S. 14
您无法从定义它们的类外部调用事件.但是,你不需要; 只需遵循惯用的模式,同时声明一个受保护的方法来触发所述事件.
class Whatever
{
public event EventHandler Foo;
protected virtual void OnFoo( EventArgs e )
{
EventHandler del = Foo;
if( del != null )
{
del( this, e );
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,类"Whatever"的后代可以通过调用OnFoo()并传入适当的EventArgs对象来触发事件.
编辑:关于为什么这是行为,Jon Skeet在另一个线程中解释得很好(这也意味着这个问题是重复的,所以投票结束):
声明类似公共字段的事件时,编译器会创建公共事件和私有字段.在同一个类(或嵌套类)中,您可以直接访问该字段,例如调用所有处理程序.从其他类中,您只能看到该事件,该事件仅允许订阅和取消订阅.