2010-09-27 7 views
1

Dire que j'ai les classes déclarées comme ceci:Comment appeler la méthode de classe de base?

public abstract class IdentifiableEntity { 
    public boolean validate() { 
     return true; 
    } 
} 

public class PreferenceCategory extends IdentifiableEntity { 
    public boolean validate() { 
     return true; 
    } 
} 

Maintenant, disons que j'ai créé la variable PreferenceCategory, et je veux appeler la méthode IdentifiableEntity.validate(), pas la méthode PreferenceCategory.validate() .

j'aurais pensé que je pouvais le faire avec un casting (voir ci-dessous), mais il appelle toujours la méthode surchargée:

PreferenceCategory cat = new PreferenceCategory(); 

// this calls PreferenceCategory.validate(), not what I want 
((IdentifiableEntity)cat).validate(); 

Est-il possible de le faire?

+0

Ajoutez un appel explicite à la méthode parente. par exemple. validate() {return super.validate(); } – Andreas

+0

Comment le testez-vous puisque la méthode 'validate()' de la base et de la sous-classe retourne 'true'. –

+0

Pouvez-vous s'il vous plaît expliquer le cas d'utilisation de celui-ci? –

Répondre

9

Vous ne pouvez pas. Votre meilleur pari est d'ajouter une autre méthode à PreferenceCategory qui appelle la méthode validate() de super.

public boolean validateSuper() { 
    return super.validate(); 
} 

Mais pourquoi voudriez-vous faire cela? C'est un peu une odeur de design. Vous pouvez trouver le chain of responsibilty pattern intéressant.

+0

Merci, ce n'est pas mon design, je ne fais que le coder :). – dcp

+0

De rien. Je vois, bonne chance avec le codage :) – BalusC

+1

puis remettre en question la qualité de la conception - c'est-à-dire dire au concepteur qu'il suce;) – Bozho

0

Vous pouvez, mais seulement dans la sous-classe:

public boolean simpleValidate() { 
    return super.validate(); 
} 

Si vous ne voulez pas primordial, pourquoi pas le nom de la méthode différemment? Si les appelants doivent être en mesure de choisir la méthode qu'ils invoquent, les méthodes font des choses différentes, ce qui devrait être reflété dans le nom de la méthode.

0

Si vous lancez un commentaire, il utilisera toujours la méthode de remplacement. Donc, vous devriez faire quelque chose comme ça ...

public class PreferenceCategory extends IdentifiableEntity { 
    public boolean validate() { 
     return true; 
    } 
    public boolean validateSuper(){ 
     return super.validate(); 
    } 
} 

Ensuite, vous appelez validatesSuper, il devrait fonctionner, bot est loin d'être une bonne programmation orientée objet, et je ne recommande vraiment pas de le faire; Si vous avez besoin d'appeler un autre validate de sorte que vous devriez juste donner un nom différent pour cette méthode et l'appeler quand vous avez besoin, ou appelez valider pour appeler la méthode superclasse maintenant, pas overrided, comme ça ...

public class PreferenceCategory extends IdentifiableEntity { 
    public boolean validatePreferenceCategory() { 
     return true; 
    } 
} 

vous pouvez toujours appeler validade de superclasse

Questions connexes