Mik*_*son 7 c# events inheritance
我有以下场景:
public abstract class SomeBaseClass
{
public event EventHandler SomeEvent;
...
}
public class SomeClass : SomeBaseClass
{
public void DoSomething()
{
//TODO
if (SomeEvent != null)
SomeEvent(this, EventArgs.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
SomeBaseClass有一个需要在基类中调用的事件,但是不能直接从基类调用该事件.为了解决这个问题,我可以覆盖基类中的事件,如下所示:
public class SomeClass : SomeBaseClass
{
new public event EventHandler SomeEvent;
Run Code Online (Sandbox Code Playgroud)
我猜这很好,但我的问题是,是否存在某种通用方法或实施上述功能的良好实践?
事实上,无法从基类调用事件表明我不应该首先这样做,也许调用事件的责任应该只在于SomeBaseClass?
Pat*_*man 12
这确实是不允许的.如果我可以推荐一种替代方法:
public abstract class SomeBaseClass
{
public event EventHandler SomeEvent;
protected void RaiseSomeEvent(EventArgs e)
{
var eh = SomeEvent;
if (eh != null)
eh(this, e);
}
}
public class SomeClass : SomeBaseClass
{
public void DoSomething()
{
//TODO
RaiseSomeEvent(EventArgs.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已将事件处理程序的调用移动到拥有类,这是.NET/C#所必需的,因为只有该类可以调用事件处理程序.其次,我通过将事件处理程序线程eh首先分配给它来使其安全.
永远不要使用new关键字隐藏基类'事件!当您使用基类'type作为变量的类型或基类调用事件时,您将得到意外的结果.