Principe d'héritage encore flou, besoin d'explication de code.

Fermé
dx3d Messages postés 68 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 19 juillet 2017 - Modifié par dx3d le 23/05/2014 à 00:37
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 23 mai 2014 à 07:59
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
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:

2 réponses

cs_ikhar Messages postés 58 Date d'inscription jeudi 26 avril 2007 Statut Membre Dernière intervention 24 mai 2014 2
Modifié par cs_ikhar le 23/05/2014 à 01:16
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
--
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 mai 2014 à 07:59
Bonjour,

Lorsque tu fais
o=new C(); o.m(p);
l'objet
o
appelle toujours la méthode
m
de la classe
C
avec les paramètres
p
.
Seulement la méthode
m(p)
peut être spécifique à la classe
C
parce 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());
 }
0