Problème avec méthode surchargée

Le
Zarak
Bonjour, je débute en Java et là j'ai une erreur que je ne comprends
pas du tout concernant une méthode surchargée.

J'ai indiqué l'erreur dans le main.
L'instance "p" de Point2 (héritée de Point) ne veut pas prendre la
méthode surchargée "déplace" sans argument de Point2, elle accepte
juste la méthode avec arguments de Point.
Pourquoi ?
Merci d'avance.

public class Helloworld
{

public static void main(String[] args){
Point p = new Point2();
p.deplace(); /* ERREUR ICI */
System.out.println(p.px + " " + p.py);
}
}

class Point{
int px,py;

Point(){}

Point(int x, int y){
px = x;
py = y;
}

void deplace(int dx, int dy){
px += dx;
py += dy;
}
}

class Point2 extends Point{

Point2(){
px = 4;
py = 9;
}

void deplace(){}
}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
ownowl
Le #16708181
Zarak a écrit :
Bonjour, je débute en Java et là j'ai une erreur que je ne comprends
pas du tout concernant une méthode surchargée.

J'ai indiqué l'erreur dans le main.
L'instance "p" de Point2 (héritée de Point) ne veut pas prendre la
méthode surchargée "déplace" sans argument de Point2, elle accepte
juste la méthode avec arguments de Point.
Pourquoi ?
Merci d'avance.

public class Helloworld
{

public static void main(String[] args){
Point p = new Point2();
p.deplace(); /* ERREUR ICI */
System.out.println(p.px + " " + p.py);
}
}

class Point{
int px,py;

Point(){}

Point(int x, int y){
px = x;
py = y;
}

void deplace(int dx, int dy){
px += dx;
py += dy;
}
}

class Point2 extends Point{

Point2(){
px = 4;
py = 9;
}

void deplace(){}
}



bonjour
c'est normal, une méthode surchargée se doit de comporter les mêmes
paramètres.
dans ton exemple tu appel la méthode deplace() sur un object Point, hors
cette méthode n'existe pas dans la classe Point

Olivier
Sylvain SF
Le #16708171
Zarak wrote on 03/09/2008 15:29:
Bonjour, je débute en Java et là j'ai une erreur que je ne comprends
pas du tout concernant une méthode surchargée.

Point p = new Point2(); p.deplace(); /* ERREUR ICI */



tu peux surcharger (remplacer) une méthode avec la même signature
(le même prototype) ou surcharger (ajouter) une méthode avec le
même nom et un jeu de paramètres différents.

ici dans Point2, tu ajoutes bien une méthode mais dans le main
tu utilises une référence Point (et non Point2), or cette classe
Point ignore la version sans paramètre; l'appel est donc illégal.

il faudrai quelque chose comme:

class Point {
int px, py;

Point(){
}
Point(int x, int y){
px = x;
py = y;
}
void deplace(){
deplace(0, 0);
}
void deplace(int dx, int dy){
px += dx;
py += dy;
}
}

class Point2 extends Point{
Point2(){
super(4, 9);
}
void deplace(){
deplace(2, 2);
}
}

Sylvain.
Zarak
Le #16708161
"ownowl"

bonjour
c'est normal, une méthode surchargée se doit de comporter les mêmes
paramètres.



Non, surcharge != redéfinition :)
Zarak
Le #16708341
"Sylvain SF"
Zarak wrote on 03/09/2008 15:29:
Bonjour, je débute en Java et là j'ai une erreur que je ne comprends
pas du tout concernant une méthode surchargée.

Point p = new Point2(); p.deplace(); /* ERREUR ICI */



tu peux surcharger (remplacer) une méthode avec la même signature
(le même prototype) ou surcharger (ajouter) une méthode avec le
même nom et un jeu de paramètres différents.

ici dans Point2, tu ajoutes bien une méthode mais dans le main
tu utilises une référence Point (et non Point2),



Ah mais quel idiot, j'ai mal relu mon main...

Enfin, ça me permet d'apprendre que : "Point p = new Point2();"
instancie un Point et non un Point2 :)

Merci.
Sylvain SF
Le #16708331
Zarak wrote on 03/09/2008 17:17:

Enfin, ça me permet d'apprendre que : "Point p = new Point2();"
instancie un Point et non un Point2 :)



non il instancie bien un Point2 mais le stocke (légitimement)
dans un Point ce qui est valide puisque Point est une super
classe de Point. et tout appel de méthode ira bien chercher
les méthodes surchargées de Point2.

le problème est seulement sur le ligne "Point.deplace()",
cet appel était illégal (pour la compile avant que pour
la résolution virtuelle) car deplace() n'existe pas pour
la classe Point.

Sylvain.
Zarak
Le #16708621
"Sylvain SF"
Zarak wrote on 03/09/2008 17:17:

Enfin, ça me permet d'apprendre que : "Point p = new Point2();"
instancie un Point et non un Point2 :)



non il instancie bien un Point2 mais le stocke (légitimement)
dans un Point ce qui est valide puisque Point est une super
classe de Point. et tout appel de méthode ira bien chercher
les méthodes surchargées de Point2.

le problème est seulement sur le ligne "Point.deplace()",
cet appel était illégal (pour la compile avant que pour
la résolution virtuelle) car deplace() n'existe pas pour
la classe Point.

Sylvain.



Ok, maintenant j'ai bien compris. Merci pour ces infos.
Publicité
Poster une réponse
Anonyme