在继承的类方法完成后引发事件

本文关键字:事件 继承 类方法 | 更新日期: 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()
{
}

诀窍是发布一个事件,并在您的方法完成时引发它,然后任何使用者都可以订阅它,并在方法完成执行时完成它的工作。