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

Java Discussion :

Factorisation de méthodes : généricité / polymorphisme


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Factorisation de méthodes : généricité / polymorphisme
    Bonjour !


    Voilà je souhaite créer une fonction statique générique, mais je n'y parviens pas. Pour mieux expliquer mon point bloquant, je vous met un code relativement court ci dessous.

    PS : En réalité, ce code ne correspond à rien, mais reprend la structure de mon vrai code, ce dernier étant autrement plus long et plus complexe (60 000 lignes héhé ^^). Ainsi si certains éléments ne vous semble pas logique, ne vous en offusquez pas.

    Voici mes deux classes statiques que je souhaite factoriser :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class Tools {
     
    	private static int getValuePersonne(String attributNom) {
    		java.lang.Object objet;
    		Personne cible = (Personne)objet;
    		return cible.getAttribut(attributNom);
    	}
     
    	private static int getValueEntreprise(String attributNom) {
    		java.lang.Object objet;
    		Entreprise cible = (Entreprise)objet;
    		return cible.getAttribut(attributNom);
    	}
     
    }

    Pour info voici les deux types de classes dont il est question plus haut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public class Personne {
     
    	private int age;
    	private int taille;
     
    	public int getAge() {
    		return age;
    	}
     
    	public int getTaille() {
    		return taille;
    	}
     
    	/**
             * Getter générique
             * @param attributNom
             * @return
             */
    	public Object getAttribut(String attributNom) {
        	    	if(attributNom.equals("age")) {
        		    	return this.getAge();
        	    	}
        	    	else if(data.equals("taille")) {
        		    	return this.getTaille();
        	    	}
        	    	return null;
        	}
     
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public class Entreprise {
     
    	private int nombreEmployes;
    	private int salaireMoyen;
     
    	public int getNombreEmployes() {
    		return nombreEmployes;
    	}
     
    	public int getSalaireMoyen() {
    		return salaireMoyen;
    	}
     
    	/**
             * Getter générique
             * @param attributNom
             * @return
             */
    	public Object getAttribut(String attributNom) {
        	    	if(attributNom.equals("nombreEmployes")) {
        		    	return this.getNombreEmployes();
        	    	}
        	    	else if(attributNom.equals("salaireMoyen")) {
        		    	return this.getSalaireMoyen();
        	    	}
        	    	return null;
        	}
     
    }

    Un grand merci à tous ceux qui voudront bien y jeter un oeil. Je continue d'investiguer de mon côté et de tenir à jour ce post.


    EDIT : correction erreurs de code.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Ce que j'ai fait :

    J'ai commencé par implémenter une interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface MonInterface<typeDescriptor> {
     
        public Object getAttribut(String attributNom);
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Personne implements MonInterface {

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Entreprise implements MonInterface {

    Afin de pouvoir écrire une fonction générique du genre suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Tools {
     
    	private static int getValue(String attributNom) {
    		java.lang.Object objet;
    		MonInterface cible = (MonInterface)objet;
    		return cible.getAttribut(attributNom);
    	}
     
    }
    Problème il faudrait que cible soit un objet de type Personne ou Entreprise, or là concrètement ce n'est rien...

    Alors j'ai cherché à implémenter mes objets de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int age = Tools.getValue("age")<Personne>;
    int effectif = Tools.getValue("nombreEmployes")<Entreprise>;
    Pour ensuite invoquer la méthode comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Tools {
     
    	private static<Objet> int getValue(String attributNom) {
    		java.lang.Object objet;
    		MonInterface<Objet> cible = (MonInterface<Objet>)objet;
    		return cible.getAttribut(attributNom);
    	}
     
    }
    Mais cela ne fonctionne pas. Je sens que je ne suis pas loin du truc mais je n'y parviens pas. Et à vrai dire j'ai beaucoup de mal à trouver des exemples concrets sur le web.


    EDIT : correction de fautes d'orthographes.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le problème c'est que tu ne spécifies jamais la provenance de ton objet source (Entreprise ou Personne).

    Ceci est invalide et ne compile même pas (objet n'est pas initialisé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		java.lang.Object objet;
    		MonInterface cible = (MonInterface)objet;

    a++

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Salut adiGuba,

    Effectivement l'erreur vient du fait que je ne spécifie pas la provenance de mon objet, mon problème étant que justement je ne savais pas trop comment m'y prendre pour la spécifier

    Mais j'ai finalement obtenu la solution car pour utiliser la méthode getAttribut() j'avais simplement besoin de "caster" mon objet avec mon interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface MonInterface {
             public Object getAttribut(String attributNom);
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Tools {
    	private static int getValue(String attributNom) {
    		java.lang.Object objet;
    		MonInterface cible = (MonInterface)objet;
    		return cible.getAttribut(attributNom);
    	}
    }
    Si mon problème est résolu, je reconnais que je continue d'avoir du mal pour concevoir des méthodes génériques... en utilisant les fameux < >

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par serge-B Voir le message
    Si mon problème est résolu, je reconnais que je continue d'avoir du mal pour concevoir des méthodes génériques... en utilisant les fameux < >
    Heu... Le code que tu donnes ne peux pas compiler...

    Enfin, ce n'est pas un problème de Generics !


    a++

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    En fait si car ce code est inséré dans une classe anonyme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private static XMLFieldHandler createFieldHandler(final String attributNom, final Class attributClass)  {
    	//Classe anonyme qui implémente XMLFieldHandler
    	XMLFieldHandler handler = (new org.exolab.castor.xml.XMLFieldHandler() {
     
    		public java.lang.Object getValue(java.lang.Object object) throws IllegalStateException {
    			DescriptorInterface target = (DescriptorInterface)object;
    			return target.getAttribut(attributNom);
    		}   
    	} );
    	return handler;
    }

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

Discussions similaires

  1. Factoriser 4 méthodes en une
    Par Mini-Tyson dans le forum C#
    Réponses: 7
    Dernier message: 23/03/2013, 13h06
  2. [PHP 5.2] [POO] Factorisation des méthodes d'un singleton
    Par mistertbo dans le forum Langage
    Réponses: 10
    Dernier message: 10/11/2009, 11h43
  3. Abstraction et factorisation de méthodes privées
    Par pmithrandir dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 03/10/2008, 14h27
  4. Réponses: 3
    Dernier message: 19/03/2007, 01h19
  5. Polymorphisme : non-reconnaissance de méthode
    Par Chen norris dans le forum C++
    Réponses: 4
    Dernier message: 24/08/2006, 11h52

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