Héritage multiple en java: incompréhensible

Fermé
omar - 26 sept. 2003 à 09:41
velocity Messages postés 203 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 16 octobre 2014 - 7 mars 2010 à 18:06
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!!
A voir également:

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
choubaka Messages postés 39375 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 14 avril 2024 2 100
26 sept. 2003 à 10:06
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.
11
velocity Messages postés 203 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 16 octobre 2014 6
7 mars 2010 à 18:06
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
3
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
1

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

Posez votre question
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
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 328
12 juin 2008 à 21:30
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,
0
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.
-6
C'est marrant comme les "Je veux" ont toujours autant de succès !
0