IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Peut on utiliser dans une super classe une methode declarée abstraite, mais definie chez sa fille


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2014
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 176
    Par défaut Peut on utiliser dans une super classe une methode declarée abstraite, mais definie chez sa fille
    Voilà, j'ai une super classe abstraite qui declare une méthode de cette manière et l'utilise aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public abstract class Parente{
    .
    interface1 = getInterface1();
    .
    protected abstract Interface1 getInterface1();
    }

    L'une de ses classes fille la définit ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Fille extends Parente
    {
    .
    .
           @Override
    	protected Interface1 getInterface1()
            {		
    		return ctx.getBean("interface1", Interface.class);
    	}
    }
    Je croyais que la méthode définie dans une classe "Fille" et déclarée abstraite chez sa mere ne pouvait pas s'utiliser chez sa "Mere"
    je ne savais pas qu'il y avait une utilisation "pluri-génération"
    Quel qu'un en sait il quelque chose?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 584
    Par défaut
    Hello,

    non seulement c'est possible, mais c'est en fait à ça que ça sert, une méthode abstraite.

    Je veux dire, ça sert aussi à être appelé par d'autres classes que la classe abstraite parente, mais, c'est la même chose.
    Qu'on les appelle de l'extérieur ou bien de la classe parente, appeler une méthode abstraite ce n'est rien d'autre qu'appeler le comportement spécifique des classes filles qui l'implémentent. On peut bien faire ça d'où on veut, il n'y a simplement aucune raison que ça change quelque chose.

    ... Sauf que...

    Une classe qui fait littéralement ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public abstract class Parente{
     
      private Interface1 interface1 = getInterface1(); // DANGER ! IL NE FAUT PAS FAIRE ÇA
     
      protected abstract Interface1 getInterface1();
     
    }
    C'est quelque chose qui est possible en Java, mais il aurait mieux valu que ce soit pas possible.

    Le problème est que interface1 est une variable membre de la classe Parente, et qu'elle est initialisée par la classe Parente. C'est à dire, avant le constructeur de la classe Parente.
    Mais, cette initialisation repose sur l'appel d'une méthode qui n'est définie que par des classes enfantes de la classe Parente, puisqu'elle est abstraite.
    Ce qui veut dire que ces méthodes sont appelées avant que l'on ait commencé à appliquer le constructeur de la classe qui les implémente, puisqu'on en est encore à initialiser les variables de la classe mère, ce qui se fait avant.

    Donc appel de la méthode avant que le constructeur n'ait terminé (ni même commencé) son travail.
    Ce n'est pas génial, et un excellent moyen de se farcir tout un tas de bugs qui vont demander à tout recoder.

    Donc, pour résumer,

    - oui, appeler une méthode abstraite à l'intérieur de la classe abstraite qui la déclare, c'est possible et c'est la raison pour laquelle ça existe les méthodes abstraites.
    - mais faire une classe comme celle que tu donnes en exemple, c'est possible mais il ne faut pas. Il faut s'en servir convenablement. Pas dans l'initialisation des variables.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/07/2016, 16h49
  2. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  3. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  4. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  5. Garder une référence vers une variable d'une autre classe
    Par choupeo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2007, 18h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo