Principe d'héritage encore flou, besoin d'explication de code.
dx3d
Messages postés
68
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour, j'ai eu beau cherché pendant un long moment ce concept d'héritage reste quelque peu flou, bien que je comprenne en quelque sorte le principe ( les classes filles hérite les méthodes de la classe mère ), je ne comprend pas des fois certains résultats, surtout quand il y a des redefinitions de méthodes effectué, pour essayer de comprendre j'ai cherché un peu sur le net et j'ai trouvé cet exemple :
A.class
B.class
C.class
Test.class
Le résultat obtenu est le suivant:
= 1 ===
A.foo()
A.bar(A)
A.bar(B)
B.foo()
A.bar(A)
B.bar(B)
C.baz(A):A
C.baz(B):B
= 2 ===
A.bar(B)
A.bar(A)
A.bar(B)
A.bar(B)
A.bar(B)
A.bar(B)
= 3 ===
A.foo()
C.baz(A):A
B.foo()
C.baz(A):B
B.foo()
C.baz(A):B
Mais dans la plupart des cas je ne comprend pas quand et pourquoi on a des A et des B ( on a déclaré A b2 = new B(); et des fois il prend la valeur A et des fois B ), si quelqu'un pouvait fournir une explication simple ou une simple définition de l'héritage qui m'aiderait à y voir plus clair, je vous en serez reconnaissant !
A.class
public class A { public String name(){ return "A"; } public void foo(){ System.out.println("A.foo()"); } public void bar(A a){ System.out.format("A.bar(%s)\n", a.name()); } }
B.class
class B extends A{ public String name(){ return "B"; } public void foo(){ System.out.println("B.foo()"); } public void bar(B b){ System.out.format("B.bar(%s)\n",b.name()); } }
C.class
public class C { public void baz(A a){ System.out.format("C.baz(A):%s\n",a.name()); } public void baz(B b){ System.out.format("C.baz(B):%s\n", b.name()); } }
Test.class
import java.util.Vector; public class TestP { public static void main(String[] args){ A a=new A(); B b=new B(); C c =new C(); System.out.println("= 1 ==="); a.foo(); a.bar(a); a.bar(b); b.foo(); b.bar(a); b.bar(b); c.baz(a); c.baz(b); System.out.println("= 2 ==="); A b2=new B(); a.bar(b2); b2.bar(a); b2.bar(b2); b.bar(b2); b2.bar(b); b.bar(b2); System.out.println("= 3 ==="); Vector<A> s = new Vector<A>(); s.add(a);s.add(b);s.add(b2); for(A e: s){ e.foo(); c.baz(e); } } }
Le résultat obtenu est le suivant:
= 1 ===
A.foo()
A.bar(A)
A.bar(B)
B.foo()
A.bar(A)
B.bar(B)
C.baz(A):A
C.baz(B):B
= 2 ===
A.bar(B)
A.bar(A)
A.bar(B)
A.bar(B)
A.bar(B)
A.bar(B)
= 3 ===
A.foo()
C.baz(A):A
B.foo()
C.baz(A):B
B.foo()
C.baz(A):B
Mais dans la plupart des cas je ne comprend pas quand et pourquoi on a des A et des B ( on a déclaré A b2 = new B(); et des fois il prend la valeur A et des fois B ), si quelqu'un pouvait fournir une explication simple ou une simple définition de l'héritage qui m'aiderait à y voir plus clair, je vous en serez reconnaissant !
A voir également:
- Principe d'héritage encore flou, besoin d'explication de code.
- Code ascii - Guide
- Code de déverrouillage oublié - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
2 réponses
Bonjour,
J'aurais vraiment aimé vous aidé, mais cela fait plus de 13 ans que je n'ai pas pratiqué Java... la faute à .net...
J'aimais pourtant particulièrement ce langage, lorsqu'il relevait encore de SUN... (hors sujet...)
Vous avez lu ceci ?
https://openclassrooms.com/fr/courses/6173501-debutez-la-programmation-avec-java?archived-source=26832
https://user.oc-static.com/pdf/10601-apprenez-a-programmer-en-java.pdf
En attendant qu'un developpeur Java se reveille...
Cordialement...
Edit:
Après vérification (très rapide, due à l'heure, et aux lointains souvenirs de Java...):
Vous semblez avoir un problème de trans-typage, vous passez vous à certaines de vos méthodes des Objet d'un type différent à celui qu'elles attendent, sans les "caster", de classe parente, ou enfant, alors qu'elles attendent de leur propre classe... votre problème ne viendrait il pas de là?
https://openclassrooms.com/forum/sujet/heritage-et-transtypage-33414#.U35_LdJ_tps
Si il me reste quelques souvenirs, l'héritage permet, entre autre, la spécialisation des classes filles...
Ainsi, un peut définir une classe EtreVivant, avec des classe filles Poisson et Humain, par exemple...
La Classe mère aura une méthode respire() vide...
Si on implémente une méthode respire() pour chaque classe fille:
Poisson.respire () {
aspirer l'eau m'entourant
la filtrer avec mes branchies
en retirer l'oxygène
}
Humain.respire() {
aspirer l'air qui m'entoure
l'envoyer vers mes poumons
en retirer l'oxygène
y transferer le CO2
expirer
}
cela permet de gérer un Objet générique EtreVivant, sans avoir besoin de connaitre les spécificité de sa méthode respirer()...
typiquement quand on n'a pas besoin de connaitre sa classe exacte...
désolé pour l'algo approximatif...
https://miashs-www.u-ga.fr/prevert/Prog/Java/CoursJava/classes2.html
--
J'aurais vraiment aimé vous aidé, mais cela fait plus de 13 ans que je n'ai pas pratiqué Java... la faute à .net...
J'aimais pourtant particulièrement ce langage, lorsqu'il relevait encore de SUN... (hors sujet...)
Vous avez lu ceci ?
https://openclassrooms.com/fr/courses/6173501-debutez-la-programmation-avec-java?archived-source=26832
https://user.oc-static.com/pdf/10601-apprenez-a-programmer-en-java.pdf
En attendant qu'un developpeur Java se reveille...
Cordialement...
Edit:
Après vérification (très rapide, due à l'heure, et aux lointains souvenirs de Java...):
Vous semblez avoir un problème de trans-typage, vous passez vous à certaines de vos méthodes des Objet d'un type différent à celui qu'elles attendent, sans les "caster", de classe parente, ou enfant, alors qu'elles attendent de leur propre classe... votre problème ne viendrait il pas de là?
https://openclassrooms.com/forum/sujet/heritage-et-transtypage-33414#.U35_LdJ_tps
Si il me reste quelques souvenirs, l'héritage permet, entre autre, la spécialisation des classes filles...
Ainsi, un peut définir une classe EtreVivant, avec des classe filles Poisson et Humain, par exemple...
La Classe mère aura une méthode respire() vide...
Si on implémente une méthode respire() pour chaque classe fille:
Poisson.respire () {
aspirer l'eau m'entourant
la filtrer avec mes branchies
en retirer l'oxygène
}
Humain.respire() {
aspirer l'air qui m'entoure
l'envoyer vers mes poumons
en retirer l'oxygène
y transferer le CO2
expirer
}
cela permet de gérer un Objet générique EtreVivant, sans avoir besoin de connaitre les spécificité de sa méthode respirer()...
typiquement quand on n'a pas besoin de connaitre sa classe exacte...
désolé pour l'algo approximatif...
https://miashs-www.u-ga.fr/prevert/Prog/Java/CoursJava/classes2.html
--
Bonjour,
Lorsque tu fais
Seulement la méthode
Il peut être intéressant pour comprendre ce qu'il se passe d'afficher le type réel de l'objet qui est appelé. Je t'invite donc à rajouter ce petit code au début de chaque méthode.
En adaptant bien sûr les valeurs qu'il faut. Exemple :
Lorsque tu fais
o=new C(); o.m(p);l'objet
oappelle toujours la méthode
mde la classe
Cavec les paramètres
p.
Seulement la méthode
m(p)peut être spécifique à la classe
Cparce que explicitement (re)définie dans son code, ou alors être définie par une classe mère, dans ce cas elle aura le même comportement que pour tous les objets de cette classe mère.
Il peut être intéressant pour comprendre ce qu'il se passe d'afficher le type réel de l'objet qui est appelé. Je t'invite donc à rajouter ce petit code au début de chaque méthode.
System.out.printf("# o.m(p), o instanceof %s, p instanceof %s\n", getClass().getSimpleName(), p.getClass().getSimpleName());
En adaptant bien sûr les valeurs qu'il faut. Exemple :
public void bar(B b){ System.out.printf("# o.bar(b), o instanceof %s, b instanceof %s\n", getClass().getSimpleName(), b.getClass().getSimpleName()); System.out.format("B.bar(%s)\n",b.name()); }