Поднять событие после завершения метода унаследованного класса - PullRequest
0 голосов
/ 23 февраля 2012

Я новичок в использовании унаследованных классов, поэтому я могу упустить что-то совершенно очевидное. У меня есть два класса, A и B, которые оба наследуют какой-то другой класс Z. Класс Z имеет несколько методов и т. Д.

Я пытаюсь выяснить, как создать событие (или просто некоторый метод) в классе A и B, которое срабатывает после , когда завершается какой-то метод в классе Z ...

Есть ли способ сделать это?

Приветствия

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Использование абстрактных методов:

Подклассы переопределяют абстрактный метод из базового класса.

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 голосов
/ 23 февраля 2012

Вы можете иметь защищенный виртуальный метод в классе 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 голос
/ 23 февраля 2012

Мне кажется, что вы хотите получить событие, посмотрите на 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()
{

}

Хитрость заключается в том, чтобы опубликовать событие и вызвать его, когда ваш метод будет готов, тогда любой потребитель может подписаться на него и выполнить свою работу, когда ваш метод завершит выполнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...