2011-02-23 55 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" 

這看起來像某種反向繼承。Groovy :: @Mixin方法覆蓋目標類方法

mixin僅用作定義新方法的手段嗎?

我當然可以使用常規繼承並使用擴展,但用例需要一個表單構建器,其中每個域都有一個唯一的表單實現,並且我希望在我的應用程序控制器中捕獲表單請求並執行MyUniqueDomainForm.mixin DefaultFormMethods(所以我只需要在需要的時候定義默認方法,以及不必在每個表單類中導入my.package.app.DefaultFormMethods)

回答

2

無論你mixin會重載已存在的任何東西...

在這個例子中,在編譯時B.test()重載了繼承的A.test()方法

但隨後在運行時,A.test()通過mixin,它增加了重新過載先前重載方法

如果不是這樣,你周圍,你將無法改變使用mixins類的現有特性

即(這是一個愚蠢的例子,但我相信它橫跨得到我的觀點):

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

Integer.mixin AddNotMinus 
println 10 - 10 

打印20

+0

謝謝蒂姆,我認爲是這樣。 Groovy「宣傳」mixin作爲繼承的替代品,但隱含的父親覆蓋 - 兒童方法沒有被提及(從我所見過的)。那麼,一個標準的孩子延伸到父母,以獲得我所期望的行爲(即沒有其他@annotion將其拉下?) – virtualeyes

+0

沒有probs。不是我所知道的...除了添加類型爲「A」的屬性並將其標記爲「@ Delegate」: - / –