public 摘要事件 class
public Event in abstract class
我在摘要中声明了事件 class:
public abstract class AbstractClass
{
public event Action ActionEvent;
}
public class MyClass : AbstractClass
{
private void SomeMethod()
{
//Want to access ActionEvent-- Not able to do so
if (ActionEvent != null)
{
}
}
}
我想在派生中访问这个基础 class 事件。此外,我想在 MyClass 的其他派生 class 中访问此事件:
MyClass.ActionEvent += DerivedMethod()
请帮助我了解如何处理抽象 classes 中定义的事件。
这种方法可能很危险,请参阅下文以获得更好的方法
只能从 声明 class 中引发事件(或显然检查是否为空)。此保护扩展到派生的 classes.
因此,解决方案是重新声明事件作为基class中抽象事件的实现。然后你仍然可以根据需要通过基础 class 引用使用它,并且 raise/use 在派生的 class:
中使用它
public abstract class AbstractClass
{
public abstract event Action ActionEvent;
}
public class MyClass : AbstractClass
{
public override event Action ActionEvent;
private void SomeMethod()
{
//Want to access ActionEvent-- Now you can!
if (ActionEvent != null)
{
}
}
}
正确做法
MSDN 表示编译器可能无法正确处理此方法。相反,您应该提供 protected
方法,以便派生的 classes 可以检查 null、调用事件等:
public abstract class AbstractClass
{
public event Action ActionEvent;
protected bool EventIsNull()
{
return ActionEvent == null;
}
}
public class MyClass : AbstractClass
{
private void SomeMethod()
{
//Want to access ActionEvent-- Now you can!
if (!EventIsNull())
{}
}
}
一个经常使用的模式如下所示(您会在 System.Windows.Forms
命名空间的 classes 中看到很多)。
public abstract class MyClass
{
public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
if (this.MyEvent != null)
{
this.MyEvent(this, e);
}
}
}
然后您可以像这样在派生的 class 中使用它,可以选择扩展行为:
public sealed class MyOtherClass : MyClass
{
public int MyState { get; private set; }
public void DoMyEvent(bool doSomething)
{
// Custom logic that does whatever you need to do
if (doSomething)
{
OnMyEvent(EventArgs.Empty);
}
}
protected override void OnMyEvent(EventArgs e)
{
// Do some custom logic, then call the base method
this.MyState++;
base.OnMyEvent(e);
}
}
我在摘要中声明了事件 class:
public abstract class AbstractClass
{
public event Action ActionEvent;
}
public class MyClass : AbstractClass
{
private void SomeMethod()
{
//Want to access ActionEvent-- Not able to do so
if (ActionEvent != null)
{
}
}
}
我想在派生中访问这个基础 class 事件。此外,我想在 MyClass 的其他派生 class 中访问此事件:
MyClass.ActionEvent += DerivedMethod()
请帮助我了解如何处理抽象 classes 中定义的事件。
这种方法可能很危险,请参阅下文以获得更好的方法
只能从 声明 class 中引发事件(或显然检查是否为空)。此保护扩展到派生的 classes.
因此,解决方案是重新声明事件作为基class中抽象事件的实现。然后你仍然可以根据需要通过基础 class 引用使用它,并且 raise/use 在派生的 class:
中使用它public abstract class AbstractClass
{
public abstract event Action ActionEvent;
}
public class MyClass : AbstractClass
{
public override event Action ActionEvent;
private void SomeMethod()
{
//Want to access ActionEvent-- Now you can!
if (ActionEvent != null)
{
}
}
}
正确做法
MSDN 表示编译器可能无法正确处理此方法。相反,您应该提供 protected
方法,以便派生的 classes 可以检查 null、调用事件等:
public abstract class AbstractClass
{
public event Action ActionEvent;
protected bool EventIsNull()
{
return ActionEvent == null;
}
}
public class MyClass : AbstractClass
{
private void SomeMethod()
{
//Want to access ActionEvent-- Now you can!
if (!EventIsNull())
{}
}
}
一个经常使用的模式如下所示(您会在 System.Windows.Forms
命名空间的 classes 中看到很多)。
public abstract class MyClass
{
public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
if (this.MyEvent != null)
{
this.MyEvent(this, e);
}
}
}
然后您可以像这样在派生的 class 中使用它,可以选择扩展行为:
public sealed class MyOtherClass : MyClass
{
public int MyState { get; private set; }
public void DoMyEvent(bool doSomething)
{
// Custom logic that does whatever you need to do
if (doSomething)
{
OnMyEvent(EventArgs.Empty);
}
}
protected override void OnMyEvent(EventArgs e)
{
// Do some custom logic, then call the base method
this.MyState++;
base.OnMyEvent(e);
}
}