Ce que j'aimerais accomplir est d'avoir une bonne mise en œuvre de
def dynamix[A, B](a: A): A with B
Je peut savoir ce que B est, mais vous ne savez pas quelle est (mais si B a une auto de type alors je pourrais ajouter quelques contraintes sur Une). Le compilateur scala est heureux avec la signature ci-dessus, mais je ne pouvais pas encore comprendre comment la mise en œuvre pourrait ressembler - si c'est possible.
Certaines options qui est venu à mon esprit:
- L'utilisation de la réflexion/dynamic proxy.
- Cas plus simple: Un est une interface Java de niveau + je peux instancier B et il n'a pas d'auto type. Je suppose qu'il ne serait pas trop dur (à moins que j'ai des méchants, des problèmes inattendus):
créer un nouveau B (b), et aussi un proxy de mise en œuvre à la fois A et B, et à l'aide d'une invocation gestionnaire de déléguer à l'un de a ou b. - Si B ne peut pas être instanciée, je pourrais toujours créer une sous-classe, et de faire comme il a été décrit ci-dessus. Si elle a également une auto de type I serait probablement besoin de quelques délégation ici et là, mais il peut encore travailler.
- Mais que faire si a est Un type de béton et je ne peux pas trouver une bonne interface?
- Aurais-je exécuter en plus de problèmes (par exemple, quelque chose lié à la linéarisation, ou de constructions spéciales aider Java interopérabilité)?
- Cas plus simple: Un est une interface Java de niveau + je peux instancier B et il n'a pas d'auto type. Je suppose qu'il ne serait pas trop dur (à moins que j'ai des méchants, des problèmes inattendus):
- À l'aide d'un habillage à la place d'un mixin et retour le B[A], a est accessible à partir de b.
Malheureusement, dans ce cas, l'appelant aurait besoin de savoir comment l'imbrication est fait, ce qui peut être assez gênant si le mélange dans/emballage est fait à plusieurs reprises (D[C[B[A]]]), car il faut trouver le bon niveau d'imbrication pour accéder à la fonctionnalité dont ils ont besoin, donc je ne le considérez pas comme une solution. - La mise en œuvre d'un compilateur plugin. Je n'ai aucune expérience avec elle, mais mon sentiment est qu'il ne serait pas anodin. Je pense que Kevin Wright autoproxy plugin a un peu le même objectif, mais il ne serait pas assez pour mon problème (encore?).
Avez-vous d'autres idées qui pourraient travailler? De quelle manière voulez-vous recommander? Quel genre de "défis" à attendre?
Ou dois-je l'oublier, car il n'est pas possible avec le Scala contraintes?
L'Intention derrière mon problème:
Dire que j'ai un flux de travail d'entreprise, mais il n'est pas trop stricte. Certaines mesures ont fixé l'ordre, mais d'autres ne le font pas, mais à la fin, tout doit être fait (ou certains d'entre eux nécessaire pour la poursuite du traitement).
Un peu plus exemple concret: j'ai un A, que je peux ajouter, B et C pour elle. Je n'aime pas ce qui est fait en premier, mais à la fin je vais avoir besoin d'un A avec B à C.
Commentaire: je ne sais pas trop sur Groovy mais ALORS surgit cette question et je pense que c'est plus ou moins la même chose que ce que je voudrais, au moins conceptuelle.