Héritage multiple en java: incompréhensible [Fermé]

Signaler
-
Messages postés
203
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
16 octobre 2014
-
Bonjour!!
Prenom un exemple soit

l'interface danseur avec les méthodes:

-danse();


et la classe chanteur avec la méthode
-chante();



soit une nouvelle classe appelé (une peu d'humour!)
michaekjacskon qui :
- hérite de la classe chanteur
- implémente l'interface danseur

l'intérêt de 'lheritage c déviter entre autre de réécrire du code et de bénéficier du code des méthodes déjà définies.

Ce dont je ne vois pas l'interet ce que michaeljackson implémente la classe danseur vu que je serais obligé de rédéfinir tts ces méthodes.


donc si j'avait fais hériter Michael jacksons seulement de la classe chanteur et que je ré-' écrit les mêmes méthodes abstraites de la classe danseur j'obttiens le même résultat : j'écris autant de ligne de code.


dou ma question quel est l'intert des interfaces vu que je peux obtenir le meme résultat sans spécifier que j 'hérite de cette interface et qu'elle ne m 'apporte aucune aide si ce n'est d'être obligé de redéfinir tt ces méthodes.
d'ou ma ?.

Merci d'avance!!

6 réponses

Bonjour Omar,

Tu as tout à fait raison, dans ton cas Java ne permet aucune solution évidente puisque tu es obligé de rédéfinir soit la fonction 'danse' soit la fonction 'chante', ce qui augmente considérablement le travail. Java n'autorise pas l'héritage multiple (et contrairement à ce que l'on peut lire un peu partout, les interfaces ne permettent pas de faire d'héritage multiple mais autorisent seulement un cas particulier pour les classes abstraites) et, si tu as besoin de ce type de fonctionnalités, je te conseille de t'orienter sur du C++, qui sera beaucoup plus puissant.

Sinon, une bidouille (mais qui rajoute aussi du boulot) :
Tu crées deux interfaces : IChanteur et IDanseur, puis deux classes Chanteur et Danseur implémentant IChanteur et IDanseur.
Ensuite pour ta classe Jackson, tu lui fais implémenter les interfaces IChanteur et IDanseur et (c'est toute l'astuce) pour ne pas réécrire ton code, tu places deux données privées 'c' et 'd' respectivement de type Chanteur et Danseur et tu appelles leurs méthodes dans les définitions des fonctions de IChanteur et IDanseur de la classe Jackson. C'est nul et pas performant mais je n'ai pas encore trouvé d'autre solution.

Charly
12
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
38091
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
29 octobre 2020
1 865
Salut

c'est justement la grande force de la programmation orientée objet...

Java ne supporte pas le multiple héritage (comme le C++ par exemple qui lui le permet).

Pour pallier à ce petit problème, on utilise les interfaces..

Celà permet de définir éventuellement un autre comportement que les membre d'une même famille de la classe..

les interfaces contiennent effectivement des méthodes non implémentées. On peut dire en fait qu'une classe qui implémente une interface, signe une sorte de contrat avec les autres objets suscpetible de faire appel à elle. Ce contrat est simple, il s'agit d'utiliser une signature de méthode "générique" et surtout de renvoyer le résultat (si il y en a) sous un format bien défini). Ce qui veut dire que tous les objets qui implémentent une interface, signent le même contrat.

prenons un exemple

une entreprise...

il existe une superclasse Abstraite Employé... cette classe pour simplifier possède une méthode abstraite public void bosse() qui ne contient pas de code. en effet, en fonction de leur travail spécifique le code sera différent (c'est un peu du polymorphisme ça...). Cette classe posséde une autre méthode public void pointe() qui elle possède du code parceque tous les employés pointe leurr arrivée au boulot de la même manière..

Toutes les instances d'Employé hériteront donc de la méthode pointe() mais devront définir le corp de la méthode bosse...

Cependant certains employés auront en plus une fonction de commandement, les chefs... qui eux en plus des autres doivent "commander".

Pour réussir ce challenge, les employés chefs vont implémenter une interface (l'interface TheBoss qui contient une méthode non implémenté public void dirige(). Il est clair que chaque chef dirige en fonction de son rang dans la hiérarchie et que le corps de la méthode sera différent pour chaque chef..

pigé?






ChoubaPostor 10000 :
Le plus bô des modos.
Messages postés
203
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
16 octobre 2014
5
salut omar,

voici un liens qui m'a expliqué le même problème que le tiens , il est super clair.
http://www.javafr.com/forum/sujet-HERITAGE-MULTIPLE-JAVA_1225935.aspx
salut omar ds cet exemple tu vois pas bien l'utilité des interfaces mais si on prends par exemple une interface qui s'appelle forme geometrique qui a des methodes abstraites surface ,perimetre... quand on veut construire une classe rectangle ou cercle...ils ont tous ces proprietés dc on les implementes facilement
j'ai un exercice pour calculer la somme et le produit de de complexe et je l'ai resolu comme ça:
import java .io.*;
public class complexe {
float reel,img;
complexe(float a,float b){
this.reel=a;
this.img=b;
}
public static complexe somme(complexe r,complexe i){
float c;
float d;
c=r.reel+i.reel;
d=r.img+i.img;
complexe com =new complexe(c,d) ;
return com;
}
public static complexe produit(complexe r,complexe i){
float e;float f;
e=(r.reel*i.reel)-(r.img*i.img);
f=(r.reel*i.img)+(r.img*i.reel);
complexe comp =new complexe(e,f);
return comp;
}
public static void main(String[] args) throws IOException
{
complexe c1 = null,c2=null;
System.out.println("entrer la partie reel de c1:");
c1.reel=Clavier.saisie_float();
System.out.println("entrer la partie imaginaire de c1:");
c1.img=Clavier.saisie_float();
System.out.println("entrer la partie reel de c2:");
c2.reel=Clavier.saisie_float();
System.out.println("entrer la partie imaginaire de c2:");
c2.img=Clavier.saisie_float();
System.out.println("la somme est:"+somme(c1,c2));
System.out.println("le produit est:"+produit(c1,c2));
}
}
mais le compilateur me leve une exception comme suit:
Exception in thread "main" java.lang.NullPointerException
quelle est la solution svp
answer me as soon as you can plz
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
325
Bonsoir,
Si j'étais toi, j'écrirais simplement un constructeur par défaut pour instancier mes variables c1 et c2 au lieu de les déclarer et de ne pas les instancier.
complexe c1 = null;
c1.reel...

ça revient à faire null.reel non ;) ?

Cordialement,
svp je veux une implementation de la classe employe en language c++,
cette classe gère +ieurs employés ds une entreprise,
merci pour votre aide.
C'est marrant comme les "Je veux" ont toujours autant de succès !