2017-11-16 1 views
1

Ich habe eine Job-Basisklasse mit einer abstrakten Work() -Methode. Dies wird in meinen geerbten Klassen überschrieben/implementiert.Anwenden wiederkehrende bedingte Überprüfung auf alle abgeleiteten Klassen

Was ich erreichen möchte, ist die Anwendung einer Abbruchbedingung für alle abgeleiteten Klassen. Das Vorlagenmethodenmuster scheint mir hier nicht zu helfen, da ich diese Überprüfung in meiner abstrakten Work() - Klasse durchführen muss.

Eine Abhilfe wäre machen Arbeit() virtuell, aber dann bin ich nicht mehr gezwungen, die Umsetzung davon (was ich tun möchte):

public abstract class First 
{ 
    protected virtual void Work() 
    { 
     //do stuff 
    } 
} 

public class Second : First 
{ 
    protected override void Work() 
    { 
     base.Work(); 
    } 
} 

Gibt es eine Möglichkeit, mein Ziel zu erreichen?

+0

Es ist schwer zu sagen, Was genau wollen Sie, aber wie wäre es mit einer 'öffentlichen Void Work()' in 'First ', die die Prüfung abbricht und' geschütztes abstraktes void WorkInternal() 'aufruft, das in den abgeleiteten Klassen implementiert ist? – Blorgbeard

Antwort

2

Die Template-Methode Muster scheint mir hier nicht helfen, weil ich diese Prüfung müssen in meiner abstrakten auftreten Work()

Sie das richtige Muster ausgesucht, aber du hast es nicht richtig anwenden.

Die Idee hinter dem Vorlagenmethodenmuster besteht darin, Work nicht virtuell zu machen und eine separate Methode, virtuell oder abstrakt, für zu überschreibende Unterklassen bereitzustellen. Auf diese Weise alle Prüfungen, die einen Job abbrechen könnte, würde in der Work Funktion der Basisklasse durchgeführt werden, während die abgeleiteten Klassen tatsächlichen Implementierungen für das, was bieten würde tun, wenn die Kontrollen haben es geschafft:

public abstract class First { 
    public void Work() { 
     if (!CheckPreconditions()) { 
      // Abort the job 
      return; 
     } 
     DoWork(); 
    } 
    protected abstract void DoWork(); 
} 

public class Second : First { 
    protected override void DoWork() { 
     // Do the actual work here 
    } 
} 
Verwandte Themen