2011-02-23 6 views
2
class A { 
    def test() { println "parent" } 
} 

@Mixin(A) 
class B { 
    def test() { println "child" } 
} 

new B().test() // prints "parent", but I am expecting it to print "child" 

Cela ressemble à une sorte d'héritage inversé.Groovy :: Les méthodes @Mixin remplacent les méthodes de classe cible

Les mixines ne doivent-ils être utilisés que pour définir de nouvelles méthodes? Je peux bien sûr utiliser l'héritage conventionnel et aller avec extends, mais le cas d'utilisation implique un constructeur de formulaire où chaque domaine a une implémentation de formulaire unique et j'aimerais, dans mon contrôleur d'application, attraper des requêtes de formulaire et faire un MyUniqueDomainForm.mixin DefaultFormMethods (donc je ne doivent définir les méthodes par défaut quand je dois, ainsi que ne pas avoir à importer my.package.app.DefaultFormMethods dans chaque classe de formulaire)

Répondre

2

tout ce que vous mixin surchargera ce qui est déjà là ...

Dans cet exemple, au moment de la compilation, B.test() surcharge la méthode A.test() héritée

Mais lors de l'exécution, A.test() est ajouté par le mixin, qui re-Surcharges la méthode précédemment surchargé

Si ce n'était pas ainsi autour de vous ne seriez pas en mesure de modifier les caractéristiques existantes d'une classe à l'aide mixins

-à-dire (ce qui est un exemple stupide, mais je crois qu'il obtient mon point de):

class AddNotMinus { 
    static def minus(int a, int b) { 
    a + b 
    } 
} 

Integer.mixin AddNotMinus 
println 10 - 10 

impressions 20

+0

Merci Tim, j'ai supposé que c'était le cas. Groovy "annonce" les mixins comme alternative à l'héritage, mais la méthode implicite parent-overrides-child n'est pas mentionnée (d'après ce que j'ai vu). Donc, on va alors avec l'enfant standard étend parent pour obtenir le comportement souhaité je suppose (c'est-à-dire aucun autre @annotion pour retirer ceci?) – virtualeyes

+0

Aucun problème. Pas que je connaisse ... Autre que d'ajouter une propriété de type 'A' et de la marquer comme' @ Delegate': - / –

Questions connexes