7
votes

Java prend-il en charge l'expédition à des implémentations spécifiques basées sur des types d'objets multiples tels que LISP?

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 :


1
votes

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.


0 commentaires

4
votes

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.

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


0 commentaires

2
votes

La manière dont vous voudriez faire OO en Java serait plus comme ceci: xxx

maintenant si vous imaginez que jaune 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)) dans la partie de votre implémentation de jaune mais comment pratiquez-vous la surcharge Mélange de vide public (Couleur C) dans Classe Bleu Pour retourner "Vous avez fait orange!" Sans modifier?


1 commentaires

Tous vos exemples impriment "Je ne sais pas quelle couleur qui fait".



9
votes

Si vous modifiez votre exemple en: xxx

alors vous obtiendrez xxx

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é).


0 commentaires

2
votes

Vous obtiendrez une meilleure image de l'exemple ci-dessous:

 PrettyPrint pp = ...;
 Person p = new Customer(...);
 pp.Print(p);


0 commentaires