2010-09-14 6 views
2

Je suis en train d'implémenter quelques classes de mathématiques et de trouver pour la première fois des problèmes avec Java (code encombrant et dupliqué) que je ne peux vraiment pas surmonter avec le codage de cleaver. La surcharge de l'opérateur serait vraiment pratique, et il y a quelques autres choses que Groovy peut faire beaucoup mieux (je peux aussi essayer Scala à un moment donné). Donc j'écris toujours les classes primaires (maintenant Complex et Matrix) en Java, mais je vais les utiliser depuis Groovy.Comment modifier une classe Java existante pour surcharger un opérateur dans Groovy?

J'ai changé le nom de certaines méthodes (.add) pour tirer parti de la surcharge de l'opérateur (.plus).

Maintenant, mes cours interagissent très bien avec le « nombre » classe de base, donc je peux utiliser:

complex.add(number); //or 
complex = complex + number; 

et obtenir une réponse impressionnante, mais je ne peux pas utiliser:

complex = number + complex 

depuis nombre ne comprend pas .add (nombre) et même si c'était le cas, il ne saurait pas comment gérer le nombre s'il s'avérait être complexe. Puis-je écrire un nombre.plus (complexe) et l'ajouter à l'interface numérique? Le code serait en fait assez facile, je pouvais l'inverser:

Number plus(complex) { 
    return complex.plus(this); 
} 

Cela fonctionnerait pour tout du numéro de type, mais je ne sais pas si Groovy peut greffer ce à l'interface numéro après le fait. (En outre, Number et Complex sont en Java, donc je le vois comme un complément pour groovy).

Un autre conseil? Devrais-je céder et apprendre Scala? Oh, je me rends compte qu'il y a probablement des paquets là-bas qui peuvent déjà le faire, mais une partie est juste en train d'apprendre les maths, je travaille sur un texte informatique quantique et j'exécute les exercices comme je vais.

Répondre

2

Vous pouvez ajouter les méthodes requises en tant que fermetures à la métaclasse Number.

Par exemple (en profitant de la commutativité de l'addition):

Number.metaClass.plus << { Complex complex -> 
    complex.plus(delegate) 
} 

Après cela, toute sous-classe Number peut être sur le côté gauche de l'équation aussi. Assurez-vous d'utiliser l'opérateur d'ajout << pour éviter d'écraser d'autres métaméthodes surchargées. Le numéro est référencé delegate au lieu de this puisqu'il s'agit d'une fermeture.

+0

Cela fonctionne, génial. Je vais devoir prendre le temps de comprendre, mais cela me donne une bonne idée par où commencer. –

Questions connexes