2012-03-06 29 views
3

我有一個Groovy超類,看起來像:稱爲超類方法的Groovy類,用於訪問關閉

class AGroovyClass { 
    private String str = "hello" 
    void printString(int nTimes) { 
    nTimes.times { println str } 
    }   
} 

和子

class AGroovySubclass extends AGroovyClass { 
    // some other subclass methods 
} 

我的客戶端代碼調用:

new AGroovySubclass().printString(5) 

這實際上打破了,因爲它說AGroovySubclass沒有這樣的屬性「str」

我會想,因爲printString方法是在AGroovyClass中,訪問「str」屬性應該沒有問題,但顯然我不正確。如果我想保持私密性,那麼做這個工作的適當方法是什麼?

回答

5

這是一個具有私人訪問修飾符的舊bug。它可以工作,如果你定義str保護。 http://jira.codehaus.org/browse/GROOVY-2433

編輯:你可以避免關閉,使用for循環代替嗎?不是很酷,但工作:)

+0

dvcs是正確的,並且解決方法。將'nTimes.times {println str}'改爲'for(for in..nTimes){println str}' - 即:使用'for'循環而不是'times'閉包 - 工作 – 2012-03-06 15:23:34

+0

for循環會執行稍好(也許10毫秒):) – 2012-03-06 15:26:35

+0

啊,是的,謝謝。如果需要,我可以使用for循環。我也可以在閉包之外創建一個指向成員變量的局部變量,然後它也可以工作。 – 2012-03-06 15:28:18