OVH Cloud OVH Cloud

[newbie] Comparer si une instance fait partie de la classe ...

9 réponses
Avatar
tsalm
Bonjour,

J'ai un Hashtable dans laquelle je r=E9cup=E9re des valeurs qui sont
d'une classe m=E9re ou d'une classe h=E9rit=E9e.
Mais quand je r=E9cuperes les valeurs et que j'y appele une m=E9thode
toString(), il me donne seulement la m=E9thode d'affichage de la classe
m=E9re.

Je sais que =E7a doit =EAtre une question idiote, mais pour r=E9cuperer
cette instance et utiliser les m=E9thodes correcte, le mieux est-il de
faire une "tentative" de cast en classe h=E9rit=E9e et de r=E9cuperer
l'erreur via une Exception ?

D'avance merci pour vos eclarcissement

TSalm

9 réponses

Avatar
spammed
l'operateur instanceof est peut etre un peu plus approprié :

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.2 0.2
Avatar
TestMan
Bonjour,

Pour rappel, en Java dans un scénario d'héritage :

A- Les méthodes de même signature sont surchargées par défaut. C'est
toujours la surcharge de la classe fille qui prend la main quelque soit
la portée.

B- Les champs de même nom sont "cachés" (deux champs cohéxistent mais
dans leurs contextes respectifs, pour y accéder il suffit de spécifier
la portée choisie par un transtypage adequat). Ceci permet aux méthodes
de chaque portée de fonctionner sans ce préoccuper des autres niveaux de
la hérarchie ;-)

Ainsi dans l'exemple :

public static class A {
public String valeur ="valeurA";
public String test(){
return "testA";
}
public String testParent(){
return valeur+"parA";
}
public String testFils(){
return valeur+"parA";
}
}
public static class B extends A{
public String valeur ="valeurB";
public String test(){
return "testB";
}
public String testFils(){
return valeur+"parB";
}
}

public class Pipo{
public static void main(String[] args) throws Exception {
A a = new B();
System.out.println("1:quel test ? "+a.test());
System.out.println("2:quel valeur ? "+a.valeur);
System.out.println("3:quel test parent ? "+a.testParent());
System.out.println("4:quel test fils ? "+a.testFils());
}
}

On a :

1:quel test ? testB
2:quel valeur ? valeurA
3:quel test parent ? valeurAparA
4:quel test fils ? valeurBparB


Le n°4 montre bien que malgrés la précision de la portée sur A, c'est la
méthode testFils de B (sa classe réelle) qui est appelée, exposant ainsi
son propre champ valeur du contexte.

Bon tests ...

A+

TM


Bonjour,

J'ai un Hashtable dans laquelle je récupére des valeurs qui sont
d'une classe mére ou d'une classe héritée.
Mais quand je récuperes les valeurs et que j'y appele une méthode
toString(), il me donne seulement la méthode d'affichage de la classe
mére.

Je sais que ça doit être une question idiote, mais pour récuperer
cette instance et utiliser les méthodes correcte, le mieux est-il de
faire une "tentative" de cast en classe héritée et de récuperer
l'erreur via une Exception ?

D'avance merci pour vos eclarcissement

TSalm



Avatar
said.rabie
tu peux metre ton code stp :)
car tout depend de comment tu fais le toString();
Avatar
said.rabie
en tout ca essayes d'eviter l'operateur instanceof car c'est pas Objet
:s , tu peux t'en sortir avec le polymorphisme
Avatar
tsalm
Merci à vous pour vos réponse vraiment compléte !!

Je vois que, en fait, je n'avais pas surchargé la méthode dans la
classe fille comme je le pensais :-/
Avatar
tsalm
oups, en fait non, c'est le matin ... je dois pas être encore
réveillé

en fait voilà le projet JBuilder :
http://florentgabriel.free.fr/DATAS/entrainementEvalModule3.zip

J'ai une classe Produit et une classe dérivée ProduitDegriffe
Une classe Panier gére ce qui est entré;
en fait, il les range dans un Hashtable.

Quand on fait "FIN" , il affiche dans la console ce qu'il a rentré
dans la Hashtable

Et que ce soit Produit ou ProduitDegriffe, il passe par la méthode
défini dans la classe mére ...
Avatar
said.rabie
je vais voir et debuguer ton code ce soir chez moi :)
Avatar
said.rabie
LOL

c'etai pas un probleme de polymorphisme :)

toute les instance que tu cree etait de la class Produit aucune
instance de la class ProduitDegriffe n'etait cree et donc c'etai normal
que ton code ne marche pas.

c'etai surement une erreue du copier / coller :)

donc dans la class FenProduitDerive

protected void ajoutDansClasseApp() {
classAppelante.ajoutProduit(
new ProduitDegriffe(Produit.getNewCode() + "",
txtLibelle.getText(),

Integer.parseInt(txtPrix.getText()),Float.parseFloat(txtPrixDegrif.getText()))
);
}

bon courage dans ton projet
Avatar
tsalm
oups .... :)
effectivement,
merci Said !