2016-07-01 10 views
0

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

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(), но это можно забыть. Есть ли способ автоматически вызвать базовый метод (и выполнять некоторые действия там) до того, как вызывается производный метод?

+0

Почему вы используете 'new' вместо * переопределения * 'RaiseAction'? Это странный подход. –

+0

Я сожалею, что не знаю об этом. Редактирование – Luca

+1

@Jon Skeet: при ближайшем рассмотрении ассер, похоже, вообще ничего не отменяет. Базовый метод не имеет параметров, а производный -. Код не выглядит правильным. – BoltClock

ответ

8

Стандартное решение этой проблемы заключается в использовании шаблона метода шаблона:

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 методы взаимодействия, но вы должны быть в состоянии адаптировать пример выше соответствующим образом.)