如何修改/覆盖从Groovy基本脚本继承的变量?

时间:2015-12-14 19:16:04

标签: java variables inheritance groovy

创建Groovy基本脚本,然后扩展该基本脚本时,为什么不能修改/覆盖继承的实例变量的值?

通常在Groovy或Java中扩展类时,只要该子类可以访问该变量而不是最终,该子类就可以修改它。但是,在Groovy中扩展基本脚本时,子类可以读取继承的变量并为它们赋值,而不会受到编译器的投诉,但是当其他方法访问变量时,它们将获得在父类中设置的值。

我尝试使用静态和实例块为变量赋值,但似乎都没有。

以下脚本是将在GroovyConsole中运行的示例。我能够覆盖继承变量值的唯一方法是重新声明变量。

abstract class MyScript extends Script
{
    public String k1 = "v1"

    public void test()
    {
        println k1
    }
}

abstract class MyScriptExtended extends MyScript
{
    // public String k1 = "v4" //<-- Have to re-declare the k1 variable to override the value from MyScript

    public MyScriptExtended() 
    {
        this.k1 = "v4"
    }

    public void test()
    {
        println "The value of k1 is $k1"
    }
}

@BaseScript(MyScriptExtended)
import groovy.transform.BaseScript

test()

我的目标是拥有一组公共变量,这些变量将在扩展我的基本脚本的类中使用,但它们也需要能够覆盖这些变量的值。

1 个答案:

答案 0 :(得分:0)

目前使用@BaseScriptGroovyShell在Groovy中解析脚本的方式,您无法修改父脚本类中声明的变量的值。

因此,您必须覆盖属性的getter或在子脚本类中重新声明它。

您可以做的另一件事是,您可以创建子脚本的新实例,然后在其对象上调用方法,而不是使用@BaseScript来执行脚本方法。