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
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%Tags und Links inheritance groovy metaclass mixins