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

avec Java Discussion :

Choix de la bonne méthode


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Siege
    Inscrit en
    Janvier 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Siege

    Informations forums :
    Inscription : Janvier 2017
    Messages : 18
    Points : 29
    Points
    29
    Par défaut Choix de la bonne méthode
    Bonjour, j'étudie un programme avec deux classes: "VueSwing" et "VueJFX" (exactement les même IHM, la seul diff est la bibliotheque utilisée) héritant de "ControleurVue" (classe abstraite). Les classes filles remonte les actions utilisateur a la classe mére en utilisant un ID pour différencier les actions.
    VueSwing:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void actionPerformed(ActionEvent e) {
    	if (c == startConnexionbutton) {
    			actionUser(1);
    		} else if (c == stopConnexionButton) {
    			actionUser(2);
    		}
    }
    Vue JavaFX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void initialize(URL arg0, ResourceBundle arg1) {
    	startConnexionbutton.setOnMouseReleased(mouseEvent -> {
    		actionUser(1);
    	});
    	stopConnexionButton.setOnMouseReleased(mouseEvent -> {
    		actionUser(2);
    	});
    }
    ControleurVue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void actionUser(int idAction) {
    	switch (idAction) {
    	case 1:
    		connection();
    		break;
    	case 2:
    		deconnection();
    		break;
    	}
    }
    La méthode "connection()"" appel une méthode abstraite "refreshNumeroCE()"" de "ControleurVue".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void connection(){
    	refreshNumeroCE();
    }
     
    public abstract void refreshNumeroCE();
    Logique, cette méthode est définie dans "VueSwing" et "VueJFX" avec un body différent.
    J'ai fait un test et java choisi la bonne méthode (refreshNumeroCE() définit dans VueJFX ou définit dans VueSwing) en fonction de l'IHM sur la quelle l'utilisateur a cliquer et je n'arrive pas a comprendre comment.
    Pouvez vous m'aider ?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est le principe même de l'héritage et de la redéfinition de méthode. La notion d'abstraction ne fait qu'insérer dans la hiérarchie une classe non instanciable, avec certaines méthodes éventuellement non définie, et qui permet de manipuler toutes les instances de type spécifique par un même type.

    Un exemple plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class abstract Vehicule {
     
       public abstract int getNombreDeRoues();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Moto extends Vehicule {
     
       public int getNombreDeRoues() {
             return 2;
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Voiture extends Vehicule {
     
       public int getNombreDeRoues() {
             return 4;
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Vehicule voiture = new Voiture();
    Vehicule moto = new Moto();
     
    System.out.println("Nombre de roues de voiture : " + voiture.getNombreDeRoues());
    System.out.println("Nombre de roues de moto : " + moto.getNombreDeRoues());
    Affiche :
    Nombre de roues de voiture : 4
    Nombre de roues de moto : 2
    
    Dans le code, à la compilation, on manipule voiture et moto par le type Vehicule, donc on peut appeler la méthode getNombreDeRoues() pour les deux instances : ça compile.
    Mais concrètement, à l'exécution, voiture est une instance de Voiture, donc le code exécuté est celui de la méthode getNombreDeRoues() de la classe Voiture, et ça retourne donc 4.
    Et concrètement, à l'exécution, moto est une instance de Moto, donc le code exécuté est celui de la méthode getNombreDeRoues() de la classe Moto, et ça retourne donc 2.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Siege
    Inscrit en
    Janvier 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Siege

    Informations forums :
    Inscription : Janvier 2017
    Messages : 18
    Points : 29
    Points
    29
    Par défaut
    Merci joel.drigo pour ton explication mais une chose me turlupine toujours:
    dans l'exemple que tu as donnée, il y a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.out.println("Nombre de roues de voiture : " + voiture.getNombreDeRoues());
    System.out.println("Nombre de roues de moto : " + moto.getNombreDeRoues());
    Ici on sait a qui on a affaire mais comment le sait-on dans ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private void connection(){
    	refreshNumeroCE();
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est l'instance elle-même "qui le sait".

    Si je modifie mon exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class abstract Vehicule {
     
       public abstract int getNombreDeRoues();
     
       public String toString() {
              return "Nombre de roues : " + getNombreDeRoues();
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Vehicule voiture = new Voiture();
    Vehicule moto = new Moto();
     
    System.out.println("voiture, " + voiture);
    System.out.println("moto, " + moto);
    va afficher :
    voiture, Nombre de roues : 4
    moto, Nombre de roues : 2
    La méthode toString() de Vehicule va être appelée lors de l'exécution sur l'instance de Voiture (héritage), et cette méthode va appeler la méthode getNombreDeRoues de la classe concrête de l'instance (redéfinition), soit Voiture, donc l'implémentation qui retourne 4.

    Et si j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Moto extends Vehicule {
     
       public int getNombreDeRoues() {
             return 2;
       }
     
       public String toString() {
                return "Moto, " + super.toString();
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Voiture extends Vehicule {
     
       public int getNombreDeRoues() {
             return 4;
       }
     
       public String toString() {
                return "Voiture, " + super.toString();
       }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Vehicule voiture = new Voiture();
    Vehicule moto = new Moto();
     
    System.out.println(voiture);
    System.out.println(moto);
    va afficher :
    Voiture, Nombre de roues : 4
    Moto, Nombre de roues : 2
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Siege
    Inscrit en
    Janvier 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Siege

    Informations forums :
    Inscription : Janvier 2017
    Messages : 18
    Points : 29
    Points
    29
    Par défaut
    Merci, je comprend mieux maintenant !!!

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

Discussions similaires

  1. [WD20] Le choix de la bonne méthode pour filtrer des données
    Par lololebricoleur dans le forum WinDev
    Réponses: 3
    Dernier message: 20/02/2015, 21h04
  2. Réponses: 2
    Dernier message: 22/08/2006, 08h28
  3. Réponses: 8
    Dernier message: 27/02/2006, 14h28
  4. [EJB2.1 Entity] [CMP] Est-ce la bonne méthode ?
    Par stailer dans le forum Java EE
    Réponses: 8
    Dernier message: 20/06/2004, 19h42

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