Le polymorphisme

paesmarc Messages postés 24 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 août 2013 - 10 avril 2013 à 11:37
paesmarc Messages postés 24 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 août 2013 - 10 avril 2013 à 21:32
Bonjour,
J'essaye de comprendre la notion de polymorphisme (sujet certainement courant !). Je comprends le concept de liaison dynamique qui consiste (en gros) à ce que la méthode à appeler est déterminée au lancement du programme, et non lors de sa compilation. Ce qui permet d'appeler la bonne méthode pour un objet déterminé.
Alors, je fais le test dont voici le code :
public class Launcher {

public static void main(String[] args){
Mere a =  new Mere();
Mere ab = new Fille();
Fille b = new Fille();

// Partie a
System.out.println("Partie a");
System.out.println(a.polymorph());
System.out.println(a.polymorph());
System.out.println(a.polymorph());

// Partie ab
System.out.println("Partie ab");
System.out.println(ab.polymorph());
System.out.println(ab.polymorph());
System.out.println( ab.polymorph(1));

// Partie b
System.out.println("Partie b");
System.out.println(b.polymorph());
System.out.println(b.polymorph());
System.out.println(b.polymorph(1));
}
}

public class Mere{

public Mere(){

}

int polymorph(){
return 1;
}

}

public class Fille extends Mere{

public Fille(){

}

int polymorph(){
return 2;
}

int polymorph(int a){
return 3;
}

}

Et là, Eclipse me mets le message d'erreur : The methode polymorph() in the type Mere is not applicable for the arguments (in) pour la partie ab méthode --> System.out.println(ab.polymorph(1));
Alors, là, je ne comprends plus rien ! Où est l'intérêt d'utilser Mere ab <gras>new Fille(); plutôt que Fille b new Fille(); </gras>?
Merci pour votre patience.

Marc

6 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
10 avril 2013 à 13:46
Salut,

Personnellement, je préfère utiliser :
Mere ab = new Fille();
plutôt que :
Fille ab = new Fille();
C'est également largement reconnu comme une bonne pratique.

L'intérêt que je vois est de pouvoir changer en un clin d'oeil par :
Mere ab = new FilleBis();
Sans avoir à changer le reste du code ! Car tu auras respecté le "contrat" défini par "Mere".

En pratique, si tu écris :
List<String> list = new LinkedList<>();
Tu pourras ensuite passer sans effort à :
List<String> list = new ArrayList<>();

Bien entendu, il faut appliquer cette règle avec bon sens ! Par exemple, alors qu'il est commun d'utiliser l'interface pour la déclaration, il ne faut pas non plus remonter trop haut, exemple souvent il sera pénalisant d'utiliser Collection plutôt que List.

Dans ton cas, si la méthode "polymorph(int)" t'es indispensable dans le reste du code, il faut considérer 2 options :
- remonter cette méthode dans l'interface Mere
- ou bien utiliser le type Fille lors de la déclaration
Choisis l'option la plus pertinente, c'est-à-dire est-ce que la méthode "polymorph(int)" doit s'appliquer à tous les sous-types de "Mere" ou seulement à "Fille" ?
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
10 avril 2013 à 13:55
J'ajouterai que quand tu codes une API pure (un ensemble d'interfaces, sans implémentation), l'intérêt d'exposer des types les plus abstraits possibles est encore plus importante. Ça offre plus de liberté pour le développement d'implémentation et ça permet de changer facilement pour une autre implémentation.

En résumé, je choisis toujours l'interface la plus abstraite qui m'offre ce dont j'ai besoin / ce que je veux représenter.
0
paesmarc Messages postés 24 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 août 2013
10 avril 2013 à 17:45
Merci pour la réponse mais je dois avouer que ça reste encore confus (inconvénient du débutant).
En effet, dans mon cas, il faut réfléchir si je ne dois pas remonter la méthode dans la classe Mere, or, le but d'une classe Fille est de la spécialiser et donc, créer de nouvelles méthodes.
Maintenant, j'imagine certainement qu'il y a des règles strictes dans l'utilisation du polymorphisme et si je comprends bien, ce n'est pas le cas. Il faut adapter son code en fonction du projet.
Je suppose que ça s'éclaircira avec l'expérience mais pour le moment, ce n'est tjrs pas clair.
Au vu de mon code Java repris ci-dessus, je ne vois pas pourquoi je devrais choisir Mere ab <gras>new Fille(); plutôt que Fille b new Fille(); </gras>!

Marc
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
10 avril 2013 à 18:33
Bonsoir,

Ce n'est pas une obligation mais seulement une bonne pratique, en général.

Si tu as une interface Vehicule et une interface Vehicule2Roues en héritant, il me parait évident que tu ne vas pas mettre la méthode getGuidon() dans l'interface Vehicule mais plutôt dans l'interface Vehicule2Roues.

Ensuite, si tu as besoin d'utiliser cette méthode, tu seras bien obligé d'utiliser l'interface "fille" Vehicule2Roues. Par contre tu ne seras pas forcément obligé d'utiliser les classes concrètes "Motocyclette" ou "Cyclomoteur".

C'est dans ce sens que je disais : utiliser la classe la plus abstraite possible m'offrant les méthodes dont j'ai besoin.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
10 avril 2013 à 18:36
Au passage, on ne parle pas de polymorphisme là.
0
paesmarc Messages postés 24 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 août 2013
10 avril 2013 à 21:32
Je commence à comprendre un peu plus la philosophie mais il y a encore du chemin à parcourir .
Tu ajoutes que l'on ne parle pas de polymorphisme. De quoi parle t'on dans ce cas-ci que je puisse orienter mes recherches ?

Merci.
0
Rejoignez-nous