2009-04-01 7 views
3
assurer

Je cette classe:méthode est appelée

public abstract class AbstractIncomingCall { 

    /* 
    class properties 
    */ 

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

    protected abstract boolean isValid(); 
} 

... qui se prolonge par cette classe:

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 
    } 

Ce que je voudrais réaliser est d'assurer que chaque fois ChangeStatus (/ * certains paramètres * /) sont appelés la méthode isValid() est appelée; Notez que la méthode isValid() est implémentée uniquement dans la classe concrète, elle utilise également les propriétés de classe héritées de la classe parente. Y a-t-il un moyen que je peux suivre pour m'assurer que isValid() est appelé autre que super? Je n'aime pas trop le fait que je doive passer des paramètres tout autour, je pense que je vais complètement dans la mauvaise direction et il y a une manière plus propre d'y parvenir. Ce que je voudrais conserver dans mon code est la logique d'appel "isValid()" dans la classe abstraite, car chaque appel doit être validé et je ne peux pas me souvenir de cela dans le futur: P

Merci d'avance:]

Répondre

14

Il semble que vous vouliez que changeStatus() suive le modèle Template Method. Dans ce modèle, vous définissez ChangeStatus() dans la classe abstraite (ce qui en définitive si vous ne faites pas confiance aux gens de prolonger correctement), et l'ont appeler les méthodes nécessaires:

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


protected abstract doSomethingSubclassSpecific(); 
+0

Presque posté la même chose ... c'est un modèle très commun. – Varkhan

+0

La méthode doit toujours être finale (pas seulement si vous ne faites pas confiance aux utilisateurs pour étendre correctement). Template Le modèle de méthode implique que la méthode est finale, c'est le seul moyen de garantir la séquence des appels ... – pgras

+0

"La seule façon de garantir" ressemble beaucoup à des extendeurs méfiants :-) mais oui, je suis d'accord avec vous qu'il est la bonne mise en œuvre – kdgregory

2

Vous n'avez pas besoin de annuler changeStatus(). Vous êtes très proche d'implémenter le motif de conception Template Method.

2

Vous pouvez faire ChangeStatus finale, et y ajouter l'appel à une méthode customChangeStatus qui pourrait être surchargée. comme ci-dessous:

classe abstraite AbstractIncomingCall publique {

/* 
class properties 
*/ 

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

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

}

Vous pouvez même mettre en œuvre une méthode vide pour customChangeStatus si vous ne avez pas besoin de mettre en œuvre toujours. En utilisant la finale dans changeStatus, vous êtes sûr que ce sera la logique lorsque vous appellerez vos classes. Et vous avez toujours la possibilité d'ajouter un comportement personnalisé.

0

Je suggère d'utiliser la composition plutôt que l'héritage. Les choses devraient devenir plus évidentes de cette façon.

+0

Pourriez-vous être plus précis sur ce que vous voulez dire? –

Questions connexes