Автоматически вызывать базовый метод перед производным

У меня есть базовый класс:

abstract class ClassPlugin
{

    public ClassPlugin(eGuiType _guyType)
    {
            GuiType = _guyType;
    }

    public eGuiType GuiType;

    protected void Notify(bool b)
    {
        ...
    }

    protected virtual void RaiseAction()
    {
        Notify(false);
    }
}

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

class ClassStartWF : ClassPlugin
{

    public ClassStartWF(eGuiType _guyType) : base(_guyType) { }

    public event delegate_NoPar OnStartWorkFlow_Ok;

    public void Action()
    {
        Notify(true);
        RaiseAction(eEventType.OK);
    }

    public new void RaiseAction(eEventType eventType)
    {
            base.RaiseAction();<--------------------

            if (OnStartWorkFlow_Ok == null)
                MessageBox.Show("Event OnStartWorkFlow_Ok null");
            else
                OnStartWorkFlow_Ok();
        }
    }
}

теперь в действии повышения я должен вызывать перед методом base.RaiseAction(), но об этом можно забыть. Есть ли способ автоматически вызывать базовый метод (и выполнять там какие-то действия) перед вызовом производного метода?


person Luca    schedule 01.07.2016    source источник
comment
Почему вы используете new вместо переопределения RaiseAction? Это странный подход.   -  person Jon Skeet    schedule 01.07.2016
comment
Да, извините, не в курсе. Редактирование   -  person Luca    schedule 01.07.2016
comment
@Jon Skeet: При ближайшем рассмотрении кажется, что спрашивающий вообще ничего не отменяет. У базового метода нет параметров, а у производного есть. Код вообще не кажется правильным.   -  person BoltClock    schedule 01.07.2016
comment
@BoltClock: Действительно, все несколько сломано. Я ответил на общую направленность вопроса, но проигнорировал образец, который является странным.   -  person Jon Skeet    schedule 01.07.2016


Ответы (1)


Стандартным решением для этого является использование шаблона template method:

public abstract class Base
{
    // Note: this is *not* virtual.
    public void SomeMethod()
    {
        // Do some work here
        SomeMethodImpl();
        // Do some work here
    }

    protected abstract void SomeMethodImpl();
}

Тогда ваш производный класс просто переопределяет SomeMethodImpl. Выполнение SomeMethod всегда будет выполнять «предварительную работу», затем пользовательское поведение, а затем «последующую работу».

(В этом случае неясно, как вы хотите, чтобы ваши методы Notify/RaiseEvent взаимодействовали, но вы должны быть в состоянии соответствующим образом адаптировать приведенный выше пример.)

person Jon Skeet    schedule 01.07.2016