Was macht Groovy hier?

9

Ich habe versucht, Code zu debuggen, der Mixins verwendet, und ich konnte mein Problem auf dieses Beispiel reduzieren. Ich habe eine Elternklasse, die Methoden über eine Mixin- und eine Kindklasse empfängt, die von der Elternklasse erbt. Wenn ich versuche, eine Methode für eine Instanz der Kindklasse zu ersetzen, wird UNLESS die Methode, die ich ersetze, für eine Instanz der Elternklasse aufgerufen, bevor sie ersetzt wird. Wenn es aufgerufen wurde, kann ich es nicht ersetzen

Also dieser Code:

%Vor%

Wird ergeben:

  

foo

     

foo

Aber wenn Sie Zeile 13 kommentieren (die mit dem Kommentar, der besagt, dass Sie es auskommentieren sollen), erhalten Sie:

  

gewinnt

Warum passiert das? Ich vermute, dass es einen Weg gibt, der im Zusammenhang mit Groovys Metaklassenmodell sinnvoll ist, aber ich verstehe es nicht.

Das ist Groovy 1.8.6

    
mfollett 01.03.2012, 22:42
quelle

1 Antwort

3

Die Metaklasse wird bei einem Methodenaufruf betrachtet, und Mixins haben ihren eigenen Handler. Beide sind lazy geladen und statisch, wenn Sie eine Methode nicht aufrufen, geschieht das statische Lazy Loading nicht Mixins haben Vorrang vor MetaClass-Überschreibungen, weshalb es foo anzeigt und nicht gewinnt, wenn Sie A initialisieren Ein Meta wird für das Objekt definiert, auf das es angewendet wird. Damit es pro Klasse aufgelöst werden kann, benötigen Sie Object.class.metaClass (d. H. Hier B.metaClass). Interessanterweise ergibt dies:

%Vor%

Definieren von foo auf B behebt den Fehler:

%Vor%

Ihre Antwort ist, dass der Mixin die Klassenmetastasen beeinflusst, und Klassenmethoden haben Vorrang vor Objektmetastasenmethoden.

Beweis:

%Vor%

Erträge:

%Vor%

Ein anderer Ansatz

%Vor%

Erträge

%Vor%     
Gepsens 16.03.2012 13:50
quelle