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 :

Comparable sur les classes mères et filles


Sujet :

Java

  1. #1
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut Comparable sur les classes mères et filles
    Bonjour à tous,

    J'ai un petit question qui peut paraître anodine mais je ne trouve pas la solution. On va supposer que j'ai une classe mère B héritant de A, suivant ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class A implements Comparable<A>{
    private Truc champComparableA;
    ...
     
    public int compareTo(A other){
    return champComparableA.compareTo(other.champComparableA)
    }
    ...
    }
    Et ma classe B :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class B extends A implements Comparable<B>{
    private Truc champComparableB;
    ...
     
    public int compareTo(B other){
    return champComparableB.compareTo(other.champComparableB)
    }
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(maCollectionA)
    marche bien.
    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(maCollectionB)
    effectue le tri sur le compareTo de la classe mère, donc ma question évidemment c'est comment dire à Java d'effectuer le compareTo sur la classe Fille quand c'est une collection de Type ClasseFille qu'on traite?

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Personnellement je n'arrive pas à compiler ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class B extends A implements Comparable<B>{
    On ne peut pas implémenté plusieurs fois la même interface Generics avec des types différents : Comparable<A> et Comparable<B>



    Il serait peut-être plus propre d'utiliser des Comparator plutôt que de redéfinir la méthode compareTo()...



    a++

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Merci pour la réponse.

    Citation Envoyé par adiGuba Voir le message
    Salut,


    Personnellement je n'arrive pas à compiler ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class B extends A implements Comparable<B>{
    On ne peut pas implémenté plusieurs fois la même interface Generics avec des types différents : Comparable<A> et Comparable<B>
    En effet, le code tel que mis ne compile pas en mettant l'erreur que tu as soulignée. Je suis obligé de mettre ca pour que ça compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class B extends A implements Comparable<A>
    Citation Envoyé par adiGuba Voir le message
    Il serait peut-être plus propre d'utiliser des Comparator plutôt que de redéfinir la méthode compareTo()...
    C'est la solution provisoire que j'ai dû utiliser, mais si tu permets je ne la trouve pas très propre. Je suis un peu surpris qu'en java on ne puisse appeler le compareTo d'une classe Fille lors d'un tri.
    Je vais attendre un peu avant de clore le sujet.

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par DevServlet Voir le message
    En effet, le code tel que mis ne compile pas en mettant l'erreur que tu as soulignée. Je suis obligé de mettre ca pour que ça compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class B extends A implements Comparable<A>
    Dans ce cas tu doit redéfinir compareTo(A) et non pas compareTo(B). Sinon tu fais de la surcharge avec une méthode qui ne sera jamais appelé...




    Mais plus que cela c'est assez casse-gueule comme comportement de changer l'implémentation de compareTo() dans une classe fille...


    Citation Envoyé par DevServlet Voir le message
    Je suis un peu surpris qu'en java on ne puisse appeler le compareTo d'une classe Fille lors d'un tri.
    Le problème c'est que c'est très casse-gueule si jamais tu as une collection mélangeant des objets A et B, car "des fois" tu utilisera une méthode, et "des fois" une autre.

    compareTo() représente l'ordre "naturel" du type, et ne devrais pas être redéfinie dans les classes filles.



    Tu pourrais détailler ton besoin exact ???


    a++

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Voila fonctionnellement le besoin :
    Je veux pouvoir trier 2 collections d'objets ayant une relation d'heritage, sachant que je ne veux pas trier la collection d'objet fille sur le même attribut que la collection d'objet Mère. Mais ce en gardant le principe du compareTo de la classe Mere. Voila l'utilisation propre au moment du tri que je veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Collections.sort(maCollectionA)==>Tri sur champA;
    Collections.sort(maCollectionB)==>Tri sur champB (sachant que champB n'est pas membre de ClasseA);
    Mais voila mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Collections.sort(maCollectionA)
    qui me va bien.
    Mais pour la ClasseB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Comparator<ClasseB> comparatorClasseB = new Comparator<ClasseB>(){
    			 public int compare(ClasseB b1, ClasseB b2) {
    	                return b1.getChampB().compareTo(b2.getChampB());
    	            }};
    		Collections.sort(this.maCollectionB,comparatorClasseB);
    ...
    Qui me parait moins propre...

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par DevServlet Voir le message
    Voila fonctionnellement le besoin :
    Je veux pouvoir trier 2 collections d'objets ayant une relation d'heritage, sachant que je ne veux pas trier la collection d'objet fille sur le même attribut que la collection d'objet Mère. Mais ce en gardant le principe du compareTo de la classe Mere.
    Tu peux redéfinir compareTo()... mais le comportement est indéfini si tu as une collections mélangeant les deux types d'objets...

    Citation Envoyé par DevServlet Voir le message
    Qui me parait moins propre...
    Pourquoi ?
    Au contraire l'utilisation d'un Comparator t'assure justement que tu utiliseras bien le bon algorithme de tri...


    a++

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Ok va pour la solution du Comparator alors.
    Merci

  8. #8
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Après rien ne t'empêche d'utiliser un Comparator static si tu dois l'utiliser souvent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class B extends A {
     
    	public static Comparator<B> COMPARE_BY_XXX_FIELD = new Comparator<B>() {
    		@Override
    		public int compare(B o1, B o2) {
    			return // TODO : code du compareTo
    		}
    	};
     
     
    	// Code de la classe B
     
    }
    Pour une utilisation plus souple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(this.maCollectionB, B.COMPARE_BY_XXX_FIELD);


    a++

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Après rien ne t'empêche d'utiliser un Comparator static si tu dois l'utiliser souvent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class B extends A {
     
    	public static Comparator<B> COMPARE_BY_XXX_FIELD = new Comparator<B>() {
    		@Override
    		public int compare(B o1, B o2) {
    			return // TODO : code du compareTo
    		}
    	};
     
     
    	// Code de la classe B
     
    }
    Pour une utilisation plus souple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.sort(this.maCollectionB, B.COMPARE_BY_XXX_FIELD);


    a++
    En effet, merci pour ton aide.

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

Discussions similaires

  1. Association et composition sur la classe mère ou ses classes filles ?
    Par WoodDev dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 30/01/2013, 10h31
  2. [COM] informations sur les classes
    Par gorgonite dans le forum Visual C++
    Réponses: 3
    Dernier message: 12/12/2006, 14h31
  3. [POO] Besoin de tutorat sur les classes
    Par misterniark dans le forum Langage
    Réponses: 11
    Dernier message: 20/04/2006, 13h48
  4. demande de renseignements sur les classes
    Par altadeos dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2006, 15h59
  5. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20

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