在继承的类方法完成后引发事件
本文关键字:事件 继承 类方法 | 更新日期: 2023-09-27 18:25:34
我是使用继承类的新手,所以我可能缺少一些非常明显的东西。我有两个类,A和B,它们都继承了其他类Z。Z类有很多方法等。
我想弄清楚的是,如何在类A和B中创建一个事件(或只是某个方法),该事件在类Z中的某个方法完成后被触发。。。
有办法做到这一点吗?
干杯
使用抽象方法:
子类覆盖基类中的抽象方法
abstract class Z {
abstract doSomethingElse();
doSomething(){
//main logic
doSomethingElse();
}
}
class A : Z {
doSomethingElse(){
//subclass logic
}
}
class B : Z {
doSomethingElse(){
//subclass logic
}
}
按惯例调用基地:
从基类覆盖虚拟方法&在开始时调用基本方法
class Z {
doSomething(){
//main logic
}
}
class A : Z {
doSomething(){
base.doSomething()
//subclass logic
}
}
class B : Z {
doSomething(){
base.doSomething()
//subclass logic
}
}
委托注入:
在超类构造函数中需要一个委托。调用委托
class Z {
delegate somethingDone
Z(_somethingDone){
somethingDone = _somethingDone
}
doSomething(){
//main logic
somethingDone()
}
}
class A : Z {
A() : base(onSomethingDone){
}
onSomethingDone(){
//subclass logic
}
}
class B : Z {
B() : base(onSomethingDone){
}
onSomethingDone(){
//subclass logic
}
}
事件订阅:
动作发生时触发事件。其他类别订阅事件
class Z {
doSomething(){
//main logic
fireEvent("SomethingDone")
}
}
class A {
A(){
subscribeToEvent("SomethingDone", onSomethingDone)
}
onSomethingDone(){
//subclass logic
}
}
class B {
B(){
subscribeToEvent("SomethingDone", onSomethingDone)
}
onSomethingDone(){
//subclass logic
}
}
您可以在类Z上拥有一个受保护的虚拟方法,并在类a和类B:中实现它
class Z
{
protected virtual AfterMethodCalled(){}
public void Method()
{
//do its job
AfterMethodCalled();
}
}
classA:Z
{
protected override AfterMethodCalled()
{
//do its job
}
}
编辑如果你想在代码中发生一些事情后引发和事件,同时让派生类改变事件行为,你可以这样做:
class Z
{
public event EventHandler AfterMethodCalled;//defines a delegate to be used as an event.
protected virtual OnAfterMethodCalled
{
if(AfterMethodCalled!=null) //if there's at least one subscriber to this event
AfterMethodCalled(this,EventArgs.Empty); //raise the event
}
public void Method()
{
//do the job
OnAfterMethodCalled();
}
then each sub class can either subscribe to this event and even change the base behavior by overriding this virtual method:
class A:
{
protected override OnAfterMethodCalled()
{
//do the job;
base.OnAfterMethodCalled(); // you can omit this line if you want to prevent raising the event
}
}
}
在我看来,你想要的似乎是一个事件,看看http://msdn.microsoft.com/en-us/library/awbftdfh.aspx有关事件的更多信息,但像这样的简单事件实现应该可以完成
基本类Z
public event Action MyEvent;
public void MyMethod()
{
// a lot of work...
SomethingHappened();
}
protected virtual void SomethingHappened()
{
Action currentEvent = MyEvent;
if (currentEvent != null)
{
currentEvent();
}
}
继承类(A或B)
public A()
{
MyEvent += DoAdditionalWork;
}
public void DoAdditionalWork()
{
}
诀窍是发布一个事件,并在您的方法完成时引发它,然后任何使用者都可以订阅它,并在方法完成执行时完成它的工作。