2
votes

Comment choisir la méthode à appeler lors de l'utilisation du polymorphisme

J'ai besoin d'un moyen de choisir la méthode à appeler.

J'appelle une méthode parente qui appelle l'une de ses méthodes en utilisant "this". Le problème est que je remplace cette méthode dans ma classe, donc lorsque j'appelle la méthode parente, elle appelle ma méthode au lieu de sa méthode.

public class MainTest    
{
    public static class A
    {
       public String m1()
       {
             return this.m2();
       }

       public String m2()
       {
           return "A.m2() called";
       }
    }

    public static class B extends A
    {
        @Override
        public String m1()
        {
          return "B.m1() called";
        }

        @Override
        public String m2()
        {
          return "B.m2() called";
        }

        public String m3()
        {
          return super.m1();
        }
    }

    public static void main(String[] args)
    {
        System.out.println(new B().m3());
    }
}

Je veux atteindre "A. m2 () appelé ", mais le résultat réel est" B.m2 () appelé "


3 commentaires

pourquoi utilisez-vous des classes statiques?


Dans quelle classe est votre méthode principale? et pourquoi vos deux classes sont statiques?


Ce sont probablement des classes imbriquées dans une autre classe. Quoi qu'il en soit, vous ne pouvez pas faire cela, sauf si vous créez une méthode dans B qui appelle super.m2 () . Sinon, cela irait à l'encontre de l'intérêt des méthodes prioritaires.


3 Réponses :


0
votes

vous pouvez voir le processus suivant:

-B.m3 fait super.m1 ce qui signifie A.m1

-A.m1 fait ceci.m2, où c'est B, pour cette raison B.m2 est appelé


2 commentaires

«Après avoir supprimé le mot clé static», il est tout à fait approprié (et conseillé) de rendre les classes imbriquées statiques si elles n'ont pas besoin de faire référence à une instance de la classe englobante.


la question a été modifiée entre-temps, avant que vous ne puissiez voir que les classes sont imbriquées. J'ai aussi mis à jour ma réponse



0
votes

Pour réaliser ce que vous voulez, vous devez appeler super.m2 () dans B.m3 .

L'appel de super.m1 () ne fonctionnerait pas car A.m1 appelle this.m2 () . ce est de type d'exécution B (vous n'avez jamais créé d'objet A donc il ne peut pas être de type d'exécution A ), donc le m2 dans B serait appelé. Vous ne pouvez appeler super.m2 () que pour obtenir ce que vous voulez.


0 commentaires

2
votes

Comme vous avez remplacé m2 () dans B , alors seul moyen de faire exécuter A.m2 () au lieu de B.m2 () consiste à appeler super.m2 () à l'intérieur de B.m2() .

Même si vous appelez super.m1 (); dans B.m3 () , l'appel à this.m2 () dans A.m1 () provoquera toujours l'exécution du B.m2 () écrasé.

Si vous ne voulez pas avoir super. m2 () à l'intérieur de B.m2 () (ou ne le souhaite pas dans tous les cas), alors la seule alternative est de créer une méthode différente que vous ne remplacez pas dans B (et appelez-le depuis A.m1 () - vous devrez peut-être changer ou créer un autre A.m1 () également): p>

public static class A {
   public String m1(){ //you may need a different method to call from B.m3()
       return this.anotherM2();
   }
   public String m2(){
       return "A.m2() called";
   }
   public String anotherM2() {
       return "A.m2() called";
   }
}


1 commentaires

Vous pouvez, bien sûr, appeler anotherM2 () dans m2 () , pour éviter de vous répéter.