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

时间:2012-02-23 01:02:43

标签: c# events inheritance

我是使用继承类的新手,所以我可能会遗漏一些完全明显的东西。我有两个类,A和B,它们都继承了一些其他类Z.Class有许多方法等。

我想弄清楚的是如何在类Z和A中创建一个事件(或者只是某种方法),在类Z中的某些方法完成后触发 ...

有办法吗?

干杯

3 个答案:

答案 0 :(得分:2)

您可以在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
}
}
    }

答案 1 :(得分:2)

使用抽象方法:

子类覆盖基类的抽象方法。

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
    }
}

答案 2 :(得分:1)

在我看来,你想要的是一个事件,看看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()
{

}

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