子类调用父级 protected 方法,期望返回 protected 覆盖属性。
但返回 parent 的属性(property)。
//父类:
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,[],[]
最佳答案
在 Java 和 Groovy 中,字段不会在子类中被覆盖。基类版本只是被子类版本隐藏。您实际上在类中获得了两个具有相同名称的字段。基类方法将看到基类字段,子类方法将看到子类字段。
解决方案通常是将字段包装在 getter 方法中。在常规中:
class AbstractController {
protected List getKeywordFilter() { [] }
...
}
class SubController extends AbstractController {
protected List getKeywordFilter() { ['a'] }
...
}
遵循 groovy 属性约定,您仍然可以将其引用为
"$keywordFilter"
这将自动调用getter。
关于不能在子类中覆盖 groovy protected 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7211738/