me lire dans Lisp, actuellement sur cette page ( http://landoflisp.com ), j'ai trouvé la déclaration suivante Au deuxième dernier paragraphe de la page qui montre lorsque vous cliquez sur le lien Clos Guild Strong>: La chose importante à noter à propos de l'exemple est que, afin de déterminer quelle méthode de mélange à appeler dans une situation donnée, la ferme doit prendre en compte les deux objets passés dans la méthode. Il est envoi em> à une implémentation spécifique de la méthode basée sur les types d'objets multiples em>. Ceci est une fonctionnalité qui n'est pas disponible dans les langages traditionnels orientés objet, tels que Java ou C ++. P>
BlockQuote> Voici l'exemple de code LISP: P>
I don't know what color that makes
you made orange!
5 Réponses :
La différence ici est que, dans Java pour expédition sur un argument, vous utiliseriez des méthodes de classe régulière (dans le fichier de classe) et pour expédition sur de nombreux arguments, vous utiliseriez une classe d'assistance (dans son propre fichier), comme dans votre exemple. . Et à Clos, il est unifié, vous utilisez une forme pour tout ce qui se sépare dans des fichiers, comme vous convient. P>
C ++ et Java peuvent surcharger des méthodes de surcharger par plusieurs arguments, mais cela est fait statiquement et ne sont que pour les méthodes (qui, pour Java, sont des citoyens de deuxième classe sous les classes et les objets). Il ne résout pas le problème d'expression en soi: vous ne pouvez pas introduire une nouvelle classe avec un nouvel ensemble de combinaisons d'arguments prises en charge et le faire travailler avec les utilisateurs existants. P>
Vous pouvez utiliser le mécanisme de réflexion que JVM prend en charge et écrire une classe qui "enregistre" par leurs arguments et stocke les données d'expédition à un stockage à cette classe. Réflexion qui aide à déduire les types d'arguments n'est pas le moyen rapide d'expédier en JVM, mais est probablement nécessaire pour mettre en œuvre des fonctions génériques em>. P>.
La manière dont vous voudriez faire OO en Java serait plus comme ceci: maintenant si vous imaginez que jaune code> est fait par vous, mais le reste est fait fait par quelqu'un d'autre. À Clos, vous pouvez fournir
(mélange de défmethod ((c2 jaune) (C1 jaune)) code> dans la partie de votre implémentation de
jaune code> mais comment pratiquez-vous la surcharge
Mélange de vide public (Couleur C) Code> dans
Classe Bleu Code> Pour retourner "Vous avez fait orange!" Sans modifier? P> P>
Tous vos exemples impriment "Je ne sais pas quelle couleur qui fait".
Si vous modifiez votre exemple en: alors vous obtiendrez p> java utilise les types d'heure de compilation pour comprendre Quelle surcharge de la méthode à appeler, où Lisp envoie des types d'exécution. Java doit utiliser le motif de visiteur afin de faire double envoi (appeler une implémentation différente basée sur le type de l'objet que la méthode est appelée et le type de l'argument passé). P> P>
Vous obtiendrez une meilleure image de l'exemple ci-dessous:
PrettyPrint pp = ...; Person p = new Customer(...); pp.Print(p);
Stackoverflow.com/questions/9759141/... < / a>
Java ne fait pas d'expédition dans votre exemple. C'est statiquement déterminé par le compilateur en regardant les types. Le LISP OTOH commun examine les objets au moment de l'exécution.