当创建Groovy基本脚本,然后扩展该基本脚本时,为什么不能修改/覆盖继承的实例变量的值?
通常,在Groovy或Java中扩展类时,只要子类可以访问变量,而不是final变量,该子类就可以对其进行修改。然而,当在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()
我的目标是拥有一组通用变量,这些变量将在扩展我的基本脚本的类中使用,但它们也需要能够覆盖这些变量的值。
目前,在Groovy中使用@BaseScript
或GroovyShell
解析Script的方式是,不能修改父脚本类中声明的变量的值。
因此,要么必须重写属性的getter,要么在子脚本类中重新声明它。
您可以做的另一件事是,您可以创建一个子脚本的新实例,然后调用其对象上的方法,而不是使用@BaseScript
来执行脚本方法。