Bonjour je voudrai seulement savoir pourquoi par moment quand on déclare un objet, on met çaCode:Personne p= new Utilisateur
l'objet sera une instance de quelle classe, pourquoi nous faisons cela?, merci d'avance pour votre aide...
Version imprimable
Bonjour je voudrai seulement savoir pourquoi par moment quand on déclare un objet, on met çaCode:Personne p= new Utilisateur
l'objet sera une instance de quelle classe, pourquoi nous faisons cela?, merci d'avance pour votre aide...
Bonjour,
Personne est une interface et Utilisateur une classe qui l'implémente.
A+.
Pourais-je avoir plus d'explication svp...
C'est ce que l'on appelle le polymorphisme.
Cela permet de créer des méthode commune à un ensemble d'objets différents, mais possédant des trait communs.
C'est une des grandes notions de base de la programmation objet.
Je te conseille la lecture suivante: http://bruce-eckel.developpez.com/li...?chap=8&page=0
EDIT
bah on voudrai une personne (donc on la choisi comme type pour la reference p)Code:Personne p= new Utilisateur();
et puisque Utilisateur EST une personne, ça passe
s'il y'a une autre classe qui implémente Personne, disons Administrateur
alors on pourra faire
sinon comme a dit sinok va plutôt essayer de comprendre le polymorphisme, dans un bouquin, ça te serai plus intéressant.Code:Personne p= new Administrateur()
juste pour exemple
tu peux avoir une méthode qui te retourne soit un Administrateur soit un Utilisateur, si tu écris le truc sans polymorphisme ça serai
ça serai plus simple de faireCode:
1
2
3
4
5
6
7
8 if( maMethode() instanceof Utilisateur ) { Utilisateur u = new Utilisateur(); //et tu continues le traitement } else { Administrateur a = new Administrateur (); //et tu continues le traitement }
et là sans ce soucier si j'ai un admin ou un user, puisque la référence peut contenir les 2 typesCode:
1
2
3 Personne p= maMethode(); //et tu continues le traitement
voilà
la dans le cas que vous avez donné quel est le type de l'objet est ce admin ou personne? et pour pouvoir faire ca il faut donc qu'admin soit une class fille de personne c'est ca? et on peux meme utiliser les méthodes de personnes?
Est ce qu'on peut utiliser aussi les méthode d'admin?
Il faut distinguer deux choses:
le type déclaré à la compilation:
Personne p = .....
Ici le type est Personne. Donc à partir de p on peux accéder à n'importe quelle méthode de Personne
Et le type réel au moment de l'exécution (qui est beaucoup plus variable)
.... = new Administrateur().
Ce qui compte pour que le code compile, c'est que les types déclarés soient correct par rapport aux méthdes invoquées
Ce qui compte pour que le code fonctionne sans erreur, c'est que les types réels soient compatbibles avec les types déclarés.
Si je reviens sur le code, je peux faire
p.uneMethodeDePersonne()
mais pas
p.uneMethodeDeAdministrateur(), car le compilateur va dire "Personne n'a pas de méthode uneMethodeDeAdministrateur"
Pour accéder aux méthodes spécifiques à l'administrateur on fera
C'est à dire qu'on informe le compilateur qu'on suppose que p est en fait un Administrateur. Ca compilera mais si, a l'exécution, p est un Utilisateur plutot qu'un Administrateur, par exemple, les code se vautrera avec un exception.Code:
1
2 ((Administrateur)p).uneMethodeDeAdministrateur()
Merci beaucoup pour votre aide, c'est très gentil de votre part, en résumé il n'y a que l'admin qui peut accéder aux méthodes de personne vu que c un fille de personne et pas l'inverse, merci beaucoup
est ce que vous entendez par ils doivent etre compatible qu'il faut qu'il y ai un héritage entre les deux?
voici un exemple de codesi les deux classes possèdent la méthode draw la quelle des deus sera appelée ?Code:
1
2 ObjetGraphique o = new Cercle(); o.draw(); // de Cercle ou de ObjetGraphique ?
j'entend que si t'as une variable de type Personne et qu'au runtime t'essaie d'y foutre un Animal, ca marchera pas :roll:
Pour ce qui est des méthodes appelée, java fait du late binding, c'est à dire que c'est au runtime qu'on cherche après la méthode sur base de son nom. Donc, dans ton cas, ce sera Cercle.draw() qui sera appelé.
oui donc il cherche d'abord dans les méthode de la référence s'il trouve pas il cherche dans le type déclaration...
non il prend l'instance réelle et cherche une méthode avec cette signature. Cette méthode est cherchée en remontant progressivement dans la hierarchie des parents jusqu'à Object.
Donc c'est comme je vous ai dit il commence par la référence vu que notre objet a une référence de type cercle il commence par cercle et il remonte, merci beaucoup pour aide, c'est très gentil... :ccool: