2010-09-27 67 views
3

我似乎無法使用Closure作爲指定內聯的超類構造函數的參數。使用Closure作爲超類構造函數的參數

class Base { 

    def c 

    Base(c) { 
    this.c = c 
    } 

    void callMyClosure() { 
    c() 
    } 
} 

class Upper extends Base { 
    Upper() { 
    super({ println 'called' }) 
    } 
} 

u = new Upper() 
u.callMyClosure() 

編譯失敗的消息Constructor call must be the first statement in a constructor.

我意識到這是一個有點奇怪的用例,我可以暫時圍繞它進行設計。但我很感興趣,這是可以預料的嗎?或者我得到的語法不正確?

回答

1

我認爲這Groovy的轉向構造成不同的東西,而試圖編譯它的問題是相關的事實一個Java類。也許封閉定義在調用super產生該錯誤之前展開。

一種解決方法是定義構造函數本身之外封閉:

class Base { 
    def c 

    Base(c) {this.c = c} 


    void callMyClosure() { 
    c() 
    } 
} 

class Upper extends Base { 
    static cc = {println 'called'} 

    Upper() { 
    super(cc) 
    } 
} 

u = new Upper() 
u.callMyClosure() 

這不是那麼好,但至少它的工作..另一種方式可能是通過使用正常new Closure(...)語法

定義關閉
+0

這就是我期待的,但只是找不到任何文檔。我還發現使用在那裏初始化的Map的相同行爲。 – 2010-09-27 21:24:16

+0

出於興趣,新的Closure語法是什麼? Closure類本身是抽象的。 – 2010-09-27 21:27:38

+0

我做了一些嘗試,找出奇怪的語法(在將它用於構造函數之前實例化閉包)..從我的理解看來,它是抽象的,因爲您通常將其子類化並實現作爲有效主體的「doCall」方法關閉 – Jack 2010-09-27 23:26:18

0

這可能會造成混亂封閉和塊......你能嘗試

super({ -> println 'called' }) 
+0

給出了我害怕的相同結果。好主意,但! – 2010-09-27 21:13:53

相關問題