2017-04-27 1 views
1

Lassen Sie uns sagen, ich habe eine BasisklasseDesign-Muster für Kinder von einer Basisklasse aufrufen, eine Methode aus der Basisklasse

public class BaseAuthenticator 
{ 
    protected void AuthenticateSuccessfully() 
    { 
     // Do stuff 
    } 
} 

Und ich habe viele Arten von authenticators alle die sich aus der Basisklasse erfordern. Ich möchte nur eine Sache aus den abgeleiteten Klassen: Es ist, dass sie nicht vergessen, AuthenticateSuccessfully() irgendwo in ihrem Code aufzurufen. Alle Authentifikatoren haben ihre eigene Logik, aber am Ende sollten sie immer AuthenticateSuccessfully() irgendwo anrufen, wenn sie dazu bereit sind (nach Validierungen usw.).

Wie kann ich beim Kompilieren sicherstellen, dass jeder abgeleitete Authentifikator die Methode AuthenticateSuccessfully() mindestens einmal aufruft?

Antwort

2

Template Methode Muster können in diesem Szenario arbeiten (Dies ist zur Laufzeit)

void Main() 
{ 
    var authenticators = new List<UserQuery.BaseClass>(); 
    authenticators.Add(new ConcreteClassA()); 
    authenticators.Add(new ConcreteClassB()); 
    foreach (var authenticator in authenticators) 
    { 
     authenticator.TemplateMethod(); 
    } 
} 


public abstract class BaseClass 
{ 
    public abstract void Validate(); 

    public void AuthenticateSuccessfully() 
    { 
     Console.WriteLine("Base Class Authentication"); 
     // Do Stuff Specific to base class 
    } 

    public void TemplateMethod() 
    { 
     Console.WriteLine("Template method called"); 
     Validate(); 
     AuthenticateSuccessfully(); 
    } 
} 

public class ConcreteClassA : BaseClass 
{ 
    public override void Validate() 
    { 
     Console.WriteLine("Validate Method of ConcreteClassA"); 
     //Do Whatever here Specific to the Concrete class A 
    } 
} 

class ConcreteClassB : BaseClass 
{ 
    public override void Validate() 
    { 
     Console.WriteLine("Validate Method of ConcreteClassB"); 
     //Do Whatever here Specific to the Concrete class B 
    } 
} 
1

Durch Entwurfsmuster allein kann dies nicht erreicht werden. Per Definition kann eine abgeleitete Klasse frei ausführen, wie sie es wünscht.

Nun haben Sie am Ende erwähnt, dass Sie dies zur Kompilierzeit bestätigen möchten. Das ist ein ganz anderer Ansatz. Ich nehme an, Sie möchten grundsätzlich eine "automatische Code-Überprüfung" durchführen, indem Sie den Entwickler auf Verstöße aufmerksam machen. Es gibt statische Codeanalyse-Tools, in denen Sie möglicherweise eine Regel schreiben können, um diese Validierung durchzuführen. Möglicherweise JetBrains ReSharper. Sieh dieses SO Post: How to add custom code analysis in ReSharper

+0

Diese Antwort macht mehr Sinn, weil verstehen, dass, wenn das Kind Klasse Entwickler nicht nennen 'base.AuthenticateSuccessfully' Dinge fehlschlagen, so ist es mehr von ihren Kopfschmerzen als deine. Sie müssen sicherstellen, dass Sie Ihre Klasse/Methode richtig dokumentieren/kommentieren, die andere nicht verpassen werden. Interessante Frage. – niksofteng

0

Ich denke, dass Sie nach dem Muster Template suchen. Sie können eine abstrakte Methode in der Basis wie bool loginAttempt() haben und in der Basisklasse AuthenticatedSuccessfully() aufrufen, wenn der Versuch zum Beispiel "true" zurückgegeben hat.

Dies ist nicht genau das, was Sie suchen (stellen Sie sicher, dass abgeleitete Klassen zur Kompilierzeit einige Methoden aufrufen), aber in den Bedingungen ein Verhalten für die abgeleiteten Klassen sicherzustellen, ist das Template-Muster Spot on.

Verwandte Themen