En fait, je ne vois pas la différence avec le polymorphisme.
Je reprend l'exemple de wikipedia :
Soit les objets Spaceship et Asteroid
Si j'ai bien compris, dans un langage à mono méthode (genre java (?)), on ne peut pas faire :
public class Asteroid
{
public boolean collide_with( Spaceship s)
{
......
}
public boolean collide_with(Asteroid a)
{
......
}
}
public class Spaceship
{
public boolean collide_with( Spaceship s)
{
......
}
public boolean collide_with(Asteroid a)
{
......
}
}
J'ai bien compris ?
}
# Si j'ai bien compris l'article Wikipédia...
Posté par lcld . Évalué à 3.
Le polymorphisme peut être statique lorsqu'on peut déterminer à la compilation quel code il faut exécuter, en regardant les types des arguments.
Ou dynamique, lorsqu'on ne sait pas à l'avance quel code sera exécuté, parce qu'un argument (mono-méthode) est de type dynamique ou que plusieurs (multi-méthode) le sont.
A noter que pour une méthode, il faut considérer la classe comme un premier argument.
En C++/Java, une méthode virtuelle est en général une mono-méthode, sinon une "multi-méthode".
Wikipédia montre un 1er exemple d'imitation de multi-méthodes en C++ (applicable aussi en Java), en déterminant le(s) type(s) manuellement (ici, par essais de transtypages), puis en appelant le bon code.
La 2è implémentation en C++ est plus élégante mais suppose d'avoir des arguments permutables (d'ailleurs, il faut s'assurer que 'void Asteroid::collide_with(Spaceship *)' et 'void Spaceship::collide_with(Asteroid *)' soient identiques, l'une appelant l'autre).
Ton exemple de code Java est correct, mais on n'a même pas affaire à des mono-méthodes.
# meuh
Posté par gc (site web personnel) . Évalué à 6.
-=-=----=-=----=-=----=-=----=-=----=-=----=-=----=-=---
public static void foo(String s) {
System.out.println("foo(String s)");
}
public static void foo(Object o) {
System.out.println("foo(Object o)");
}
public static void main( String args[] ) throws IOException {
Object m = null;
foo(m);
m = "";
foo(m);
}
-=-=----=-=----=-=----=-=----=-=----=-=----=-=----=-=---
Donne :
foo(Object o)
foo(Object o)
Noter qu'on peut forcer la sélection de la bonne méthode avec, si cela s'y prète (mais c'est bien crade) :
foo((String)m);
Une observation parallèle intéressante est qu'en java, "null" peut être implicitement typé. En effet, foo((String)null) et foo((Object)null) sont valides et permettent de sélectionner entre les deux méthodes foo :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.