2016-07-01 21 views
0

ich eine Basisklasse haben:automatisch aufrufen Basismethode vor dem abgeleiteten ein

abstract class ClassPlugin 
{ 

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

    public eGuiType GuiType; 

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

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

und dann habe ich einige abgeleitete Klassen:

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(); 
     } 
    } 
} 

jetzt in der Erhöhung Aktion, die ich vor dem verlangen base.RaiseAction() Methode, aber das kann vergessen werden. Gibt es eine Möglichkeit, die Basismethode automatisch aufzurufen (und dort einige Aktionen auszuführen), bevor die abgeleitete Methode aufgerufen wird?

+0

Warum verwenden Sie 'new' statt * überwiegenden * 'RaiseAction'? Das ist ein seltsamer Ansatz. –

+0

Yep entschuldige es nicht. Bearbeiten – Luca

+1

@ Jon Skeet: Bei näherer Betrachtung scheint der Fragesteller überhaupt nichts zu übersteuern. Die Basismethode hat keine Parameter und die abgeleitete Methode. Der Code scheint überhaupt nicht richtig zu sein. – BoltClock

Antwort

8

Die Standard-Lösung ist die Template-Methode Muster zu verwenden:

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(); 
} 

Dann einfach Ihre abgeleitete Klasse überschreibt SomeMethodImpl. Ausführen von SomeMethod führt immer die "Pre-Work", dann das benutzerdefinierte Verhalten, dann die "Post-Work".

(In diesem Fall ist es nicht klar, wie Sie Ihre Notify/RaiseEvent Methoden zur Interaktion, aber Sie sollten das Beispiel anpassen oben entsprechend der Lage sein.)