2009-06-04 35 views
4

在Groovy中,我有一個父類,並在父類的構造函數試圖用封閉如下面的代碼中設置父類的字段值的子類:Groovy的父/子私有字段訪問怪誕用封

try { 
    def x = new ChildClass() 
} catch (ex) { 
    ex.printStackTrace(System.err) 
} 

class ParentClass { 
    private values = [] 

    ParentClass(columnCount) { 
    columnCount.times { values.add('') } 
    } 
} 

class ChildClass extends ParentClass { 
    ChildClass() { 
    super(20) 
    } 
} 

然而,當我運行此代碼,我收到了groovy.lang.MissingPropertyException消息「沒有這樣的屬性:值類:ChildClass」。不過,如果我更改父類的構造函數不使用與時代同步方法的蓋,在這個例子中:

try { 
    def x = new ChildClass() 
} catch (ex) { 
    ex.printStackTrace(System.err) 
} 

class ParentClass { 
    private values = [] 

    ParentClass(columnCount) { 
    def i 
    for (i = 0; i < columnCount; i++) { 
     values.add('') 
    } 
    } 
} 

class ChildClass extends ParentClass { 
    ChildClass() { 
    super(20) 
    } 
} 

它的工作原理。有人可以向我解釋這種行爲嗎?我不明白爲什麼Groovy認爲價值觀領域是兒童階層的財產。我正在使用Groovy版本「Groovy版本:1.6.3 JVM:1.5.0_18」。

回答

4

這是在當前版本的groovy中的一個已知的bug,目標是在groovy 2.0中修復。見GROOVY-3073

由於第一個示例中的閉包無法看到私有類級別變量的元類中的範圍錯誤,所以發生了這種情況。

解決此問題的一個潛在問題是在超類中聲明本地別名變量,這將解決閉包中的範圍問題。將構造函數更改爲:

ParentClass(columnCount) { 
    def valueAlias = values 
    columnCount.times { valueAlias.add('') } 
    }