Forum Programmation.autre C'est quoi le multi-méthode ?

Posté par  (site web personnel) .
Étiquettes : aucune
0
10
oct.
2005
Bonjour, malgré google et ça ( http://en.wikipedia.org/wiki/Multimethod(...) ) , je ne parviens pas à comprendre clairement ce qu'est le multi-méthode.

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  . Évalué à 3.

    le multi-méthode serait un cas particulier de polymorphisme.

    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  (site web personnel) . Évalué à 6.

    Le support du multiple dispatch ("honorer" les multi-méthodes) est le fait qu'en cas de polymorphisme présentant plusieurs implémentations du même nom de méthode avec le même nombre de paramètres, où uniquement le type des paramètres de la méthode varie, le langage arrive à choisir la bonne méthode en explorant le type réel des arguments. Java ne disposant pas de cette fonctionnalité, le code suivant utilisera deux fois la méthode foo(Object) alors que dans le deuxième cas, le paramètre étant de type String il y a une "meilleure" méthode à utiliser. C'est une simplification de l'implémentation du langage (et une possibilité supplémentaire d'optimisation). En pratique pour mon cas personnel, il est rare que je me heurte à ce problème (mais ça peut être chiant lorsqu'on manipule génériquement des collections d'objets hétérogènes avec des méthodes spécialisées pour les types possibles, et ça m'est arrivé).

    -=-=----=-=----=-=----=-=----=-=----=-=----=-=----=-=---
    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.