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 :

Héritage générique polymorphisme


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2020
    Messages : 15
    Points : 13
    Points
    13
    Par défaut Héritage générique polymorphisme
    Bonjour les amis,

    j'ai un petit problème concernant les class générique !

    Comment faire pour qu'un class générique hérite d'une class générique et ensuite instancier cette dernière ?

    Quand je cherche un exemple de ce type de code, partout où je regarde je ne vois que des exemples de la "wildecard"

    Voilà un petit code simple qui permet vous montrer mon problème :

    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
    public class Personne<T, S, I> {
     
     
     
        protected T nom;
        protected S prenom;
        protected I age;
     
        public Personne (T nom, S prenom,  I age    ) {
            this.nom = nom;
            this.prenom = prenom;
            this.age = age;
        }
     
        // getter et setter
     
     
        public String jeSuis() {
            return "Bonjour je m'appel "+this.prenom+" et mon nom est "+this.nom+". J'ai "+this.age+ " ans.";
        }
    }
    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
    public class Famille < E, B, C > extends Personne  {
     
        private E frere;
        private B soeur;
        private C cousin;
     
        public Famille(E frere, B soeur, C cousin, String nom, String prenom, int age ) {
            super(nom, prenom, age);
            this.frere = frere;
            this.soeur = soeur;
            this.cousin = cousin;
        }
     
                // getter et setter
     
     
        public String JeSuis() {
            return super.jeSuis()+" Mon frère s'appel "+this.frere+", ma soeur s'appel "+this.soeur+" et mon cousin s'appel "+this.cousin+".";
        }
     
    }
    Et voici ma méthode "main()" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
            Personne<String, String, Integer> a = new Personne<String, String, Integer>("Bitchou", "Jean", 31);
        System.out.println(a.jeSuis());
     
        Famille<String, String, String> b = new Famille<String, String, String> ("Bernard", "Albert", "Robert", "Bitchou","Jean", 31);
        System.out.println(b.jeSuis());
        }
    Comme vous pouvez le voir, je ne sais pas du tout comment instancier ma class "Famille" et encore moins comment faire pour créer mon constructeur de la class "Famille".

    Je vous remercie d'avance pour votre aide

  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,

    Citation Envoyé par ouelado Voir le message
    Comme vous pouvez le voir, je ne sais pas du tout comment instancier ma class "Famille" et encore moins comment faire pour créer mon constructeur de la class "Famille".
    Et pourtant c'est bien ce que tu fais, instancier un objet de classe Famille dans ton "main" et le constructeur de la classe Famille est comme il se doit.

    Je pense que ton problème c'est plutôt que tu t'attends à voir :
    Bonjour, Je m'appelle Jean et mon nom est Bitchou. J'ai 31 ans.
    Bonjour, Je m'appel Jean et mon nom est Bitchou. J'ai 31 ans. Mon frère s'appel Bernard, ma soeur s'appel Albert et mon cousin s'appel Robert.
    alors que tu obtiens :
    Bonjour, Je m'appel Jean et mon nom est Bitchou. J'ai 31 ans.
    Bonjour, Je m'appel Jean et mon nom est Bitchou. J'ai 31 ans.
    Bon, pour le nom de la soeur, Albert, je ne ferais pas de commentaires Enfin, si, je viens d'en faire
    Le vrai souci est que tu appelles la méthode jeSuis(), avec un j minuscule, alors que la méthode qui écrit la chaîne que tu attends, c'est JeSuis(), avec un j majuscule...
    Cela n'a rien à voir avec les génériques, mais avec le polymorphisme et la sensibilité à la casse de Java : quand on redéfinit une méthode, elle faut qu'elle ait le même nom, casse comprise.


    Cependant c'est dans l'usage des paramètres qu'il y a aussi des soucis.

    1. Tout d'abord, comme Personne est paramétrée par <T, S, I>, on devrait la paramétrer lorsqu'on y fait référence, que ça soit :

      1. Par instanciation :

        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        new Personne<String, String, Integer>( "a", "b", 42 );
      2. Par extension :

        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        public class PersonneSpecifique extends Personne<String, String, Integer> {
         
             public PersonneSpecifique(String nom, String prenom, Integer age) {
                  super(nom, prenom, age);
             }
         
        }
        ou

        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        public class PersonneStandard<T  extends Number> extends Personne<String, String, T> {
         
             public PersonneStandard(String nom, String prenom, T age) {
                  super(nom, prenom, age);
             }
         
        }


      On peut ne pas le faire mais à quoi sert-il de la paramétrer si on utilise pas les paramètres ? C'est comme si on utilisait que le type Object pour les arguments/attributs. Ce qui rendrait assez compliqué de les manipuler, autrement que par les méthodes de Object, ce qui limitent pas mal.

      Le but des paramètres c'est de pouvoir créer une classe dont les types d'arguments, d'attributs, de retour de méthodes sont possiblement multiples et qu'on ne veut pas écrire plusieurs classes. Par exemple, pour l'interface List de Java, on peut gérer des listes de n'importe quoi (des String, des Integer, des Personne, etc). Avant l'apparition des génériques, quand on utilisait une liste :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      List list = new ArrayList(),
      list.add(20);
      list.add(22);
      et qu'on voulait traiter les éléments contenus dans la liste, par exemple, faire la somme de tous les Integer contenus dans sans cette liste, on ne pouvait que supposer que la liste contenait bien des Integer et caster :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      public static long somme(List list) {
          long somme=0;
          for(int i=0; i<list.size(); i++) {
               Object obj = list.get(i);
               somme+=((Integer)obj).intValue();
          }
          return somme;
      }
      Avec les paramètres, on dit au compilateur qu'on attends une liste d'Integer, ce qui permet de la traiter comme telle. Si le programmeur décide de l'ignorer, tant pis pour lui.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      public static long somme(List<Integer> list) {
          long somme=0;
          for(int i=0; i<list.size(); i++) {
               somme+=list.get(i).intValue();
          }
          return somme;
      }
      En plus, comme List contient de l'Integer, on peut utiliser directement les méthodes de Integer sans avoir à caster. List.get() retourne directement un objet du type qu'on veut gérer.

      Dans ton cas de Personne, tu dis que le nom, le prénom et l'age peuvent être n'importe quoi, du String, du Integer, du List, du Scanner ou même du JFrame. C'est quoi l'intérêt au juste ?
      On pourrait faire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      public class Personne<T, S, I extends Number>
      On peut supposer que le nom peut être n'importe quoi, tant qu'on utilise la méthode toString() pour en récupérer une représentation String. Et que l'age peut être n'importe quel type de nombre, Integer, Long, Float, etc, si tant est que ça ait une utilité et qu'on puisse la manipuler pour faire ce qu'on en veut (comparer les ages de personnes, calculer la date de naissance, etc).
    2. Si le but est de pouvoir faire que Famille soit construite à partir de Personne, tu peux faire :
      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
       
      public class Personne<I extends Number> {
       
          protected String nom;
          protected String prenom;
          protected I age;
       
          public Personne (String nom, String prenom,  I age    ) {
              this.nom = nom;
              this.prenom = prenom;
              this.age = age;
          }
       
          // getter et setter
       
       
          public String jeSuis() {
              return "Bonjour, Je m'appelle "+this.prenom+" et mon nom est "+this.nom+". J'ai "+this.age+ " an"+(this.age.intValue()>1?"s":"")+".";
          }
      }
      puis

      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
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      ublic class Famille<I extends Number>
      		extends Personne<I> {
       
      	private Personne<I> frere;
      	private Personne<I> soeur;
      	private Personne<I> cousin;
       
      	public Famille(Personne<I> frere, Personne<I> soeur, Personne<I> cousin, String nom, String prenom, I age) {
      		super(nom, prenom, age);
      		this.frere = frere;
      		this.soeur = soeur;
      		this.cousin = cousin;
      	}
       
      	public Famille(Personne<I> frere, Personne<I> soeur, Personne<I> cousin, Personne<I> personne) {
      		super(personne.nom, personne.prenom, personne.age);
      		this.frere = frere;
      		this.soeur = soeur;
      		this.cousin = cousin;
      	}
       
      	// getter et setter
       
      	public String jeSuis() {
      		return super.jeSuis()+"\n" + 
      				"mon frère " + this.frere.prenom + " est " + getAgeComparaison(frere, this) + " agé que moi.\n" +
      				"Ma soeur "+this.soeur.prenom+" est " + getAgeComparaison(soeur, this) + " agée que moi.\n" +
      				"Mon cousin "+ this.cousin.prenom+" est " + getAgeComparaison(cousin, this) + " agé que moi.";
      	}
       
      	private String getAgeComparaison(Personne<I> personne1, Personne<I> personne2) {
      		int age1 = personne1.age.intValue();
      		int age2 = personne2.age.intValue();
      		String comparaisonstring;
      		if (age1 < age2) {
      			comparaisonstring = "moins";
      		} else if (age1 > age2) {
      			comparaisonstring = "plus";
      		} else {
      			comparaisonstring = "aussi";
      		}
      		return comparaisonstring;
      	}
       
      }
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      public static void main(String[] args) {
       
      		Personne<Integer> a = new Personne<>("Bitchou", "Jean", 31);
      		System.out.println(a.jeSuis());
       
      		Personne<Integer> b = new Personne<>("Bitchou", "Bernard", 29);
      		Personne<Integer> c = new Personne<>("Bitchou", "Roselyne", 43);
      		Personne<Integer> d = new Personne<>("Bitchou", "Robert", 31);
       
      		Famille<Integer> f = new Famille<>(b, c, d, a);
       
      		System.out.println(f.jeSuis());
      	}
      qui affiche
      Bonjour, Je m'appelle Jean et mon nom est Bitchou. J'ai 31 ans.
      Bonjour, Je m'appelle Jean et mon nom est Bitchou. J'ai 31 ans.
      mon frère Bernard est moins agé que moi.
      Ma soeur Roselyne est plus agée que moi.
      Mon cousin Robert est aussi agé que moi.
    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
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2020
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    joel.drigo Merci beaucoup pour cette réponse incroyablement complète. J'ai tout compris !

    Effectivement je suis encore débutant et j'ai encore un peu de mal à bien paramétrer mes class.

    Mais en tout cas grâce à toi j'ai pu avancer et la généricité est devenu beaucoup plus compréhensible grâce à toi.

    Merci encore

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

Discussions similaires

  1. héritage et polymorphisme
    Par julien.metais dans le forum Hibernate
    Réponses: 3
    Dernier message: 17/05/2009, 09h58
  2. Réponses: 10
    Dernier message: 17/07/2008, 20h01
  3. héritage et polymorphisme
    Par davdou dans le forum JSF
    Réponses: 2
    Dernier message: 23/11/2007, 09h51
  4. [C#] Information sur héritage et polymorphisme
    Par LE NEINDRE dans le forum C#
    Réponses: 21
    Dernier message: 14/06/2007, 11h00
  5. Réponses: 19
    Dernier message: 05/06/2007, 08h13

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