不能在子类中覆盖 groovy protected 属性

标签 groovy

子类调用父级 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/

相关文章:

java - def fileName = new File(directoryName +"XYZ.md") 不适用于云环境

java - Selenium headless Chrome 崩溃,而有头 Chrome 工作得很好

json - 我正在尝试将 'ffprobe'与Java或groovy一起使用

groovy - 无法 stub @Shared字段

excel - 在 Groovy 中打开现有 Excel 文件

grails - ArrayList 上的分页

groovy - 自动格式化build.gradle

groovy - 为什么在 Groovy 闭包中设置的实例变量的值在其外部不可见?

groovy - 从 lib 目录构建的准系统 Gradle

regex - Groovy 扩展正则表达式语法