2011-08-27 116 views
3

子類調用父保護方法,期望返回受保護的覆蓋屬性。 但返回父級的屬性。groovy受保護的屬性不能在子類中覆蓋

//父類:

package tz 

import java.util.List; 

class AbstractController { 
    protected List keywordFilter = [] 
    protected String methodKey(){ 
     return "\t[method]parent,$keywordFilter,"+keywordFilter.toString() 
    } 
    def closureKey(){ 
     return "\t[closure]parent,$keywordFilter,"+keywordFilter.toString() 
    } 
} 

//子類:

package tz 

import java.util.List; 

class SubController extends AbstractController{ 
    protected List keywordFilter = ['a'] 
    public SubController(){ 
    } 

    public void test(){ 
     println "subCall:"+methodKey()+closureKey() 
    } 
    def test2 = { 
     println "c,$keywordFilter,"+methodKey()+closureKey() 
    } 

    public static void main(String[] args) { 
     def s = new SubController() 
     s.test() 
     s.test2() 
    } 
} 

//輸出:

subCall:[method]parent,[],[] [closure]parent,[],[] 
c,[a], [method]parent,[],[] [closure]parent,[],[] 

回答

7

在Java和Groovy,字段沒有在子類中重寫。基類版本僅由子類版本隱藏。你實際上在課堂上有兩個字段,名字相同。基類方法將會看到基類字段,並且子類方法將會看到子類字段。

解決方案通常只是將字段包裝在getter方法中。在常規:

class AbstractController { 
    protected List getKeywordFilter() { [] } 
    ... 
} 
class SubController extends AbstractController { 
    protected List getKeywordFilter() { ['a'] } 
    ... 
} 

繼常規財產約定,你仍然可以參考它爲"$keywordFilter",它會自動調用的getter。