Accueil de l'archive Service proposé par Hervé AGNOUX

TOUT -|- TOUT sur le visuel -|- TOUT sur la logistique

Date sent:      	Tue, 28 Nov 2000 18:19:46 +0100
From:           	"Alain Aïtoulha" <Alain.Aitoulha@ln.cit.alcatel.fr>
Organization:   	Alcatel
To:             	java@u-strasbg.fr
Subject:        	Définition du polymorphisme
Send reply to:  	java@u-strasbg.fr

Nous voudrions entre collègues préciser la définition du polymorphisme.
Olivier Dedieu nous a donné récemment une définition par l'exemple :

"FigGeo[] tab = new FigGeo[] {new Carre(), new Triangle(), new
Cercle()};

for(int i=0; i < tab.length; i++) {
  tab[i].dessineToi();
}

Toutes les figures (Carre, Triangle, Cercle) implement la meme
interface (FigGeo) ce qui permet de les gerer dans un meme conteneur
(tab) tout en pouvant invoquer une de leur méthode (dessineToi())"

La méthode dessineToi() est polymorphe car son comportement diffère
selon le type d'objet auquel elle est rattachée à un moment donné. Mais au
niveau implémentation, on se pose les questions suivantes, sachant que
dans l'exemple d'Olivier dessineToi() a toujours la même signature :

- dans une même classe, une méthode définie plusieurs fois avec des
signatures différentes est-elle polymorphe ?
- est-ce qu'une méthode définie dans une classe mère et surchargée dans
une classe fille est d'emblée polymorphe ? En fait j'ai l'impression que
signature ou surcharge n'engendrent pas implicitement le polymorphisme
sauf si le comportement (donc le codage) de la méthode diffère par la
signature ou la surcharge non ?

Merci pour vos éclaircissements car cette notion de polymorphisme
fondamentale je crois en objet n'est pas très claire dans toutes les
têtes, la mienne la première.
A. Aïtoulha


     

From:           	"Cedric Beust" <cedric@beust.com>
To:             	<java@u-strasbg.fr>
Subject:        	RE: Définition du polymorphisme
Date sent:      	Wed, 29 Nov 2000 01:23:56 -0800
Send reply to:  	java@u-strasbg.fr

> From: aitoulh1@ln.cit.alcatel.fr [mailto:aitoulh1@ln.cit.alcatel.fr]On
> Behalf Of Alain Aïtoulha

> - dans une même classe, une méthode définie plusieurs fois avec des
> signatures différentes est-elle polymorphe ?

Pas selon la definition communement admise du polymorphisme. Les
signatures doivent etre identiques (et traditionnellement, la valeur de
retour fait partie de la signature, du moins pour les langages ne
supportant pas la covariance).

> - est-ce qu'une méthode définie dans une classe mère et surchargée dans
> une classe fille est d'emblée polymorphe ?

Tant qu'on parle de definitions, tu devrais faire la difference entre
surcharger et redefinir. Dans la phrase ci-dessous, tu parles de
redefinition.

Et pour repondre a la question ainsi reformulee, ca depend du langage. En
C++, la reponse est non (oui si la fonction est declaree virtuelle). En
Java, la reponse est oui (non si la fonction est declaree final, auquel
cas la classe fille ne compilera pas).

> En fait j'ai l'impression que signature ou surcharge n'engendrent pas
> implicitement le polymorphisme sauf si le comportement (donc le codage)
> de la méthode diffère par la signature ou la surcharge non ?

Pas compris.

--
Cedric

     

From:           	Dreistadt David <D.Dreistadt@kheops.com>
To:             	"'java@u-strasbg.fr'" <java@u-strasbg.fr>
Subject:        	RE: Définition du polymorphisme
Date sent:      	Wed, 29 Nov 2000 10:28:20 +0100
Send reply to:  	java@u-strasbg.fr


Bonjour Alain

>dans une même classe, une méthode définie plusieurs fois avec des
>signatures différentes est-elle polymorphe ?

Je ne pense pas car le polymorphisme se caracterise par une resolution de
nom a l'execution (Late Binding). Par ailleurs, avec ta solution ("une
méthode définie plusieurs fois avec des signatures différentes"), le choix
portant sur la fonction a appeler peut etre fait des la compilation (Early
Binding). Le seul souci, c'est que je crois que cette explication est
moyennement vraie en Java ;-) Il me semble en effet que seuls les appels
de methodes finales sont resolus a la compilation, les autres le sont a
l'execution (on choisit alors la version la plus specifique).

>est-ce qu'une méthode définie dans une classe mère et surchargée dans une
>classe fille est d'emblée polymorphe ?

Je pense que oui. En effet, comme je viens de le dire, Java attend
l'execution pour choisir la methode a appeler. Son choix porte alors sur
la version la plus specifique (donc celle de la fille).


Il ne s'agit bien sur la que de mon avis personnel. Toutes les
infirmations ou confirmations sont les bienvenues.

Cordialement
David

     

Date sent:      	Wed, 29 Nov 2000 10:44:41 +0100
From:           	Remi Forax <forax@univ-mlv.fr>
To:             	java@u-strasbg.fr
Subject:        	Re: Définition du polymorphisme
Send reply to:  	java@u-strasbg.fr

Cedric Beust wrote:
> 
> > From: aitoulh1@ln.cit.alcatel.fr [mailto:aitoulh1@ln.cit.alcatel.fr]On
> > Behalf Of Alain Aïtoulha
> 
> > - dans une même classe, une méthode définie plusieurs fois avec des
> > signatures différentes est-elle polymorphe ?
> 
> Pas selon la definition communement admise du polymorphisme. Les
> signatures doivent etre identiques (et traditionnellement, la valeur de
> retour fait partie de la signature, du moins pour les langages ne
> supportant pas la covariance).
> 
> > - est-ce qu'une méthode définie dans une classe mère et surchargée
> > dans une classe fille est d'emblée polymorphe ?
> 
> Tant qu'on parle de definitions, tu devrais faire la difference entre
> surcharger et redefinir. Dans la phrase ci-dessous, tu parles de
> redefinition.
> 
> Et pour repondre a la question ainsi reformulee, ca depend du langage.
> En C++, la reponse est non (oui si la fonction est declaree virtuelle).
> En Java, la reponse est oui (non si la fonction est declaree final,
> auquel cas la classe fille ne compilera pas).

un peu plus complique que cela si tu ajoutes les visibilites :

class A {
  private void m();
}

class B extends A {
  public void m();
}

ici, il n'y a pas ici de polymorphisme :)

> 
> > En fait j'ai l'impression que signature ou surcharge n'engendrent pas
> > implicitement le polymorphisme sauf si le comportement (donc le
> > codage) de la méthode diffère par la signature ou la surcharge non ?
> 
> Pas compris.
> 
> --
> Cedric

Remi

     

Date sent:      	Wed, 29 Nov 2000 11:14:22 +0100
From:           	"Alain Aïtoulha" <Alain.Aitoulha@ln.cit.alcatel.fr>
Organization:   	Alcatel
To:             	java@u-strasbg.fr
Subject:        	Re: Définition du polymorphisme
Send reply to:  	java@u-strasbg.fr

Cedric Beust wrote:

> > From: aitoulh1@ln.cit.alcatel.fr [mailto:aitoulh1@ln.cit.alcatel.fr]On
> > Behalf Of Alain Aïtoulha
>
> > - dans une même classe, une méthode définie plusieurs fois avec des
> > signatures différentes est-elle polymorphe ?
>
> Pas selon la definition communement admise du polymorphisme. Les
> signatures doivent etre identiques (et traditionnellement, la valeur de
> retour fait partie de la signature, du moins pour les langages ne
> supportant pas la covariance).
>
> > - est-ce qu'une méthode définie dans une classe mère et surchargée
> > dans une classe fille est d'emblée polymorphe ?
>
> Tant qu'on parle de definitions, tu devrais faire la difference entre
> surcharger et redefinir. Dans la phrase ci-dessous, tu parles de
> redefinition.
>
> Et pour repondre a la question ainsi reformulee, ca depend du langage.
> En C++, la reponse est non (oui si la fonction est declaree virtuelle).
> En Java, la reponse est oui (non si la fonction est declaree final,
> auquel cas la classe fille ne compilera pas).

Merci pour ces explications.

>
>
> > En fait j'ai l'impression que signature ou surcharge n'engendrent pas
> > implicitement le polymorphisme sauf si le comportement (donc le
> > codage) de la méthode diffère par la signature ou la surcharge non ?
>
> Pas compris.

Exemple :
class A {
    protected affiche() {
        <code>
    }
}

class B extends A {
    protected affiche() {
        super.affiche();
    }
}

Tu vois que dans cette exemple (code inutile mais juste pour illustrer) la
méthode affiche() de B surcharge affiche() de la classe mère. Mais
fonctionnellement, elle ne fait rien de plus, en fait elle ne surcharge
rien du tout et donc ne change pas le comportement : je pense donc que ce
n'est pas une méthode polymorphe. C'est le codage de la méthode fille qui
engendre le polymorphisme ... Alain.


>
>
> --
> Cedric

     

From:           	"Cedric Beust" <cedric@beust.com>
To:             	<java@u-strasbg.fr>
Subject:        	RE: Définition du polymorphisme
Date sent:      	Wed, 29 Nov 2000 06:01:06 -0800
Send reply to:  	java@u-strasbg.fr

> From: aitoulh1@ln.cit.alcatel.fr [mailto:aitoulh1@ln.cit.alcatel.fr]On

> Exemple :
> class A {
>     protected affiche() {
>         <code>
>     }
> }
>
> class B extends A {
>     protected affiche() {
>         super.affiche();
>     }
> }
>
> Tu vois que dans cette exemple (code inutile mais juste pour illustrer)
> la méthode affiche() de B surcharge affiche() de la classe mère.

Pas "surcharge", "redefinit".

> Mais fonctionnellement, elle ne
> fait rien de plus, en fait elle ne surcharge rien du tout et donc ne
> change pas le comportement : je pense donc que ce n'est pas une méthode
polymorphe.

C'est ton interpretation, mais je ne pense pas que ca corresponde a la
definition communement admise.   Dans la mesure ou dans le code suivant :

A a = new B();
a.affiche();

a.affiche() va en fait appeler B.affiche(), il s'agit bel et bien de
polymorphisme.

Note egalement au passage qu'une methode devant appeler sa parente est
signe d'un design tres fragile et qu'il vaut donc mieux eviter d'imposer
cette contrainte aux classes filles.

--
Cedric
http://beust.com/cedric

     

Date sent:      	Wed, 29 Nov 2000 15:44:26 +0100
From:           	"Alain Aïtoulha" <Alain.Aitoulha@ln.cit.alcatel.fr>
Organization:   	Alcatel
To:             	java@u-strasbg.fr
Subject:        	Re: Définition du polymorphisme
Send reply to:  	java@u-strasbg.fr

Cedric Beust wrote:

> > From: aitoulh1@ln.cit.alcatel.fr [mailto:aitoulh1@ln.cit.alcatel.fr]On
>
> > Exemple :
> > class A {
> >     protected affiche() {
> >         <code>
> >     }
> > }
> >
> > class B extends A {
> >     protected affiche() {
> >         super.affiche();
> >     }
> > }
> >
> > Tu vois que dans cette exemple (code inutile mais juste pour
> > illustrer) la méthode affiche() de B surcharge affiche() de la classe
> > mère.
>
> Pas "surcharge", "redefinit".

Désolé, mon vocabulaire n'est pas bon ...

>
>
> > Mais fonctionnellement, elle ne
> > fait rien de plus, en fait elle ne surcharge rien du tout et donc ne
> > change pas le comportement : je pense donc que ce n'est pas une
> > méthode
> polymorphe.
>
> C'est ton interpretation, mais je ne pense pas que ca corresponde a la
> definition communement admise.   Dans la mesure ou dans le code suivant
> :
>
> A a = new B();
> a.affiche();
>
> a.affiche() va en fait appeler B.affiche(), il s'agit bel et bien de
> polymorphisme.

Ok, ta réponse est sans ambigüité.
Merci pour toutes ces explications.
Alain.


>
>
> Note egalement au passage qu'une methode devant appeler sa parente est
> signe d'un design tres fragile et qu'il vaut donc mieux eviter d'imposer
> cette contrainte aux classes filles.
>
> --
> Cedric
> http://beust.com/cedric

C'est fini ! Retour à l'accueil de la pseudo-archive