Héritage multiple en java: incompréhensible
Fermé
omar
-
26 sept. 2003 à 09:41
velocity Messages postés 204 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 16 octobre 2014 - 7 mars 2010 à 18:06
velocity Messages postés 204 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 16 octobre 2014 - 7 mars 2010 à 18:06
A voir également:
- Héritage multiple en java: incompréhensible
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java décompiler - Télécharger - Langages
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
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
choubaka
Messages postés
39424
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
4 avril 2025
2 104
26 sept. 2003 à 10:06
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.
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.
velocity
Messages postés
204
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
16 octobre 2014
6
7 mars 2010 à 18:06
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
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
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
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
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
329
12 juin 2008 à 21:30
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.
ça revient à faire null.reel non ;) ?
Cordialement,
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,