2009-04-01 3 views
3

genannt Ich habe diese Klasse:Sicherstellung Methode

public abstract class AbstractIncomingCall { 

    /* 
    class properties 
    */ 

    public void changeStatus(/*some parameters*/){ 
     //store parameters in class properties 
     isValid(); 
    } 

    protected abstract boolean isValid(); 
} 

..., die von dieser Klasse erweitert:

public class IncomingCallImpl extends AbstractIncomingCall{ 

    //I override the parent's method 
    public void changeStatus(/*same parameters as parent's method*/) { 
     super.changeStatus(/*same parameters as parent's method*/); 
     //do something interesting 
    } 

    protected boolean isValid() throws StatusChangeNotOccurredException { 
     //implement my validation algorithm 
    } 

Was ich möchte, ist sicherzustellen, erreichen, dass immer dann, wenn Change (/ * einige Parameter * /) wird aufgerufen die isValid() Methode wird aufgerufen; Beachten Sie, dass die Methode isValid() nur in der konkreten Klasse implementiert ist und auch Klasseneigenschaften verwendet, die von der übergeordneten Klasse geerbt wurden. Gibt es eine Möglichkeit, die ich verfolgen kann, um sicherzustellen, dass isValid() anders als das Aufrufen von Super aufgerufen wird? Ich mag die Tatsache nicht, dass ich Parameter überall herumgeben muss, ich denke, dass ich völlig in die falsche Richtung gehe und es einen saubereren Weg gibt, dies zu erreichen. Was ich gerne in meinem Code behalten möchte, ist die "isValid() Aufruflogik" in der abstrakten Klasse, da jeder Aufruf validiert werden muss und ich mich nicht darauf verlassen kann, dass ich mich in Zukunft daran erinnere: P

Vielen Dank im Voraus:]

Antwort

14

Es klingt, als ob Sie wollen, dass changeStatus() dem Template Method-Muster folgt. In diesem Muster definieren Sie Change() in der abstrakten Klasse (so dass es endgültig, wenn Sie nicht richtig Menschen vertrauen zu verlängern), und haben sie die erforderlichen Methoden aufrufen:

public final void changeStatus() 
{ 
    doSomethingSubclassSpecific(); 
    isValid() 
} 


protected abstract doSomethingSubclassSpecific(); 
+0

Fast posted die gleiche ... das ist ein sehr häufiges Muster. – Varkhan

+0

Die Methode muss immer endgültig sein (nicht nur, wenn Menschen nicht darauf vertrauen, dass sie richtig erweitert werden). Template-Methode Muster impliziert die Methode ist endgültig, es ist der einzige Weg, um die Reihenfolge der Anrufe zu garantieren ... – pgras

+0

"Der einzige Weg zu garantieren" klingt viel wie misstrauisch Extender :-) aber ja, ich stimme Ihnen zu, dass es ist die richtige Implementierung – kdgregory

2

Sie brauchen nicht zu überschreiben changeStatus(). Sie sind sehr nah daran, das Template Method Entwurfsmuster zu implementieren.

2

Sie könnten changeStatus final machen und den Aufruf einer customChangeStatus-Methode hinzufügen, die überschrieben werden könnte. wie unten:

public abstract class AbstractIncomingCall {

/* 
class properties 
*/ 

public final void changeStatus(/*some parameters*/){ 
    //store parameters in class properties 
    isValid(); 
    customChangeStatus(); 
} 

protected abstract void customChangeStatus(); 
protected abstract boolean isValid(); 

}

Man könnte sogar eine leere Methode für customChangeStatus implementieren, so dass Sie nicht brauchen, um immer es umzusetzen. Mit dem final im changeStatus sind Sie sicher, dass dies die Logik beim Aufruf Ihrer Klassen sein wird. Und Sie haben immer noch die Flexibilität, benutzerdefiniertes Verhalten hinzuzufügen.

0

Ich empfehle die Verwendung der Zusammensetzung und nicht der Vererbung. Die Dinge sollten auf diese Weise deutlicher werden.

+0

Konnten Sie genauer sein, was Sie meinen? –

Verwandte Themen