2012-09-06 58 views
4

我有一個抽象的java類,它有一個構造函數,我從一個groovy類擴展它。 (這個想法是把Java類作爲契約保存在應用程序中,並加載實現特定構造函數和方法的外部groovy類)Groovy抽象類的構造函數和繼承

如何強制Groovy實現抽象超類的構造函數? Groovy是否允許強制執行抽象父類的構造函數?

問題是Eclipse Groovy IDE並不強迫我在子類中實現父類的構造函數,我認爲Groovy會自動創建它,所以這就是不強制它的原因。然而,在運行時,如果我沒有在子類中定義父構造函數,則嘗試使用java反射失敗時會失敗,所以失敗。

(我在Groovy 0經驗)

回答

5

它看起來像在編譯器中未經檢查的情況。反編譯後,擴展類獲得一個空的構造函數。因爲這種情況在運行時不起作用,所以測試應該引起您的注意。

我不知道如何使用這個類;我試過我知道的方式:

abstract class AbstractClass { 
    String string 
    Integer integer 
    AbstractClass(String string, Integer integer) { 
    this.string = string 
    this.integer = integer 
    } 
} 

class ImplClass extends AbstractClass { } 

// every constructor fails 
abs1 = new ImplClass('a', 1) 

abs2 = [string: 'b', integer: 2] as ImplClass 

abs3 = new ImplClass(abs: 'c', a: 3) 

abs4 = ImplClass [string:'d', integer:4] 

他們都沒有在運行時工作,但編譯得很好;-)。這種情況更多的是編譯錯誤與運行時錯誤。也許填充JIRA?

另一方面,如果您需要繼承構造函數,則可以在擴展類中使用@groovy.transfom.InheritConstructors。這樣你就可以不需要明確地調用super()的構造函數。