maminovadu75
Messages postés37Date d'inscriptionlundi 14 novembre 2005StatutMembreDernière intervention16 novembre 2006
-
21 déc. 2005 à 11:09
cs_Zart
Messages postés285Date d'inscriptionjeudi 29 juillet 2004StatutMembreDernière intervention27 juin 2006
-
21 déc. 2005 à 14:35
Bonjour , je ne comprend pas certain chose :
j'ai une interface : FruitLike.
je créer ma classe Fruit qui implément FruitLike.
Je créer une classe orange qui étend Fruit.
dans Orange j'ai le code suivant
Orange anOrange = new Orange();
Fruit aFruit = (Fruit)anOrange; // c koi ce morceau de code je comprend rien.
FruitLike aFruit = (FruitLike)anOrange; // c koi ce morceau de code je comprend rien.
cs_ducheseb
Messages postés344Date d'inscriptionmardi 18 mai 2004StatutMembreDernière intervention23 juin 20069 21 déc. 2005 à 11:46
Quand tu as une classe qui étend d'une autre cela signifie que c'est sa sous-classe. Par conséquent, la classe Orange qui étend de Fruit possède les propriétés de Fruit plus ses propres propriétés.
Par conséquent, lorsque tu fais new Orange(), le constructeur de Orange fera un new Fruit().
Comme Orange est une sous-classe de Fruit, tu peux ranger une variable de type Orange dans une variable de type Fruit car une Orange est un Fruit. Pour faire cela tu doit "caster" l'objet, donc faire:
Orange anOrange = new Orange();
Fruit aFruit = (Fruit) anOrange;
De même, tu pourrais ne déclarer que des variables de type Fruit et faire:
Fruit aFruit= new Orange();
tu peux ensuite faire un test si tu veux utiliser une variable Orange:
if (aFruit instanceof Orange){
Orange anOrange = (Orange) aFruit;
}
J'espère que cela t'aidera
"A game is a series of interesting choices." Sid Meier
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 201017 21 déc. 2005 à 12:16
pas tout a fait si je ne me trompe pas tu peut faire passe une variable de type fruit a oragne mais pas le contraire
Fruit orange = new Fruit(param);
Orange transtypageToOrange = (Orange)orange;
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
cs_ducheseb
Messages postés344Date d'inscriptionmardi 18 mai 2004StatutMembreDernière intervention23 juin 20069 21 déc. 2005 à 13:00
Je pense que ce que tu viens d'écrire n'est pas correct.
Tu ne peux pas faire : Fruit orange new Fruit(...); et Orange myOrange (Orange) orange;
car le Fruit que tu as définit n'est pas une instance de Orange, il ne peux pas savoir lorsque tu l'as créé qu'il a les propriétés de Orange.
Mais tu peux faire: Fruit orange = new Orange(); car Orange est une sous classe de Fruit.
De même, tu ne peux pas faire un "downcast" si le type de l'objet que tu cast n'est pas réellement du type de la sous classe.
Exemple:
JTextField un_text = new JFormattedTextField();
JTextField un_textfield = new TextField();
JTextField mon_test_ok = (JTextField) un_text; //Ceci marche car JFormattedTextField est une sous classe de JTextField, on n'est même pas obligé de spécifier la classe mère;
JFormattedTextField mon_test_ko = (JFormattedTextField) un_textfield; //Ceci NE marche PAS car le JTextField déclaré ne peux pas avoir les propriétés de JFormattedTextField puisqu'il n'a pas été déclaré comme tel.
Par contre tu peux toujours caster avec une classe mère:
par exemple, JPanel et JFrame sont des filles de java.awt.Container donc si tu souhaites faire une fonction générique pour ces deux types d'objets, tu peux faire:
public Container maFontion (Container obj){
// A l'intérieur tu teste si le composant ajouté est de type des classes filles
if (obj instanceof JFrame){
JFrame jf = (JFrame) obj; //OK car obj est bien une JFrame
//modif
return jf;//OK car Container est une classe mère
}
if (obj instanceof JPanel){
JPanel jp = (JPanel) obj; //OK car obj est bien un JPanel
//modif
return jp;//OK car Container est une classe mère
}
}
tu pourras l'utiliser en passant en paramètre tout type d'objet fille de java.awt.Container
Cela permet de ne pas créer des fonctions pour chaque type d'objet.
En conclusion
- Tu peux toujours mère un objet d'une classe fille dans un objet d'une classe mère (tu peux tout mettre dans Object)
- Tu ne peux mettre un objet, provenant d'une variable de type classe mère, dans une classe fille uniquement si cet objet a été créé comme une instance de la classe fille.
"A game is a series of interesting choices." Sid Meier
Vous n’avez pas trouvé la réponse que vous recherchez ?
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 201017 21 déc. 2005 à 13:03
ok
tt facon j'evite les transtypage mais ca m'etonne que si orange est une sous classe de Fruite tu puisse pas caster celui ci en une de ces sous classe qui etendrai Fruit
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 20116 21 déc. 2005 à 13:24
tu peux le faire a la compilation mais a l execution tu va avoir un ClassCastException.
tu peut transtyper des objets vers des classes supérieures mais pas faire l inverse une orange est un fruit mais un fruit n est pas une orange (banane est un fruit mais banane n est pas une orange)
maminovadu75
Messages postés37Date d'inscriptionlundi 14 novembre 2005StatutMembreDernière intervention16 novembre 2006 21 déc. 2005 à 13:44
Donc si je comprend bien , ca sert a dire :
Orange anOrange = new Orange();
Fruit aFruit = (Fruit)anOrange ; // je dit que anOrange est un fruit
Spherique aSphere = (Spherique)anOrange; // anOrange est un sphérique ??
donc aSphere correspond a une Orange et aFruit a un fruit
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 20116 21 déc. 2005 à 13:59
non une orange est sphérique, un fruit ne l est pas
tu dois faire
Orange anOrange = new Orange();
Fruit aFruit = (Fruit)anOrange ;
Spherique aSphere = (Spherique)anOrange ;
en réalité la ton code va marcher parce que derriere fruit se cache une orange (donc elle est spéhrique donc ca va passer) mais imagine que t ai fait
Banane banane = new Banane();
Fruit aFruit = (Fruit)banane ; //la ca marche
Spherique aSphere = (Spherique)banane ; // la ca plante , une banane est pas sphérique
attention le compilateur ne va pas te dire que c est pas bon parce que quadn tu cast un objet tu lui dis en gros, je sais ce que je fais et ca va marcher donc le compilo ne te dis rien, mais a l execution, s il s avere que ton fuit n est pas sphérique ca va péter (si ton fruit l est ce sera bon)
super_toinou
Messages postés764Date d'inscriptionmardi 25 mai 2004StatutMembreDernière intervention 8 mars 20116 21 déc. 2005 à 14:00
ou meme sur mon contre exemple ca aura fait pareil
Banane banane = new Banane();
Fruit aFruit = (Fruit)banane ; //la ca marche
Spherique aSphere = (Spherique)aFruit ; // la ca plante , une banane est pas sphérique