2015-12-14 87 views
3

创建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() 

我的目标是有一组将在延长我的基地脚本,但他们还需要能够覆盖这些变量的值类使用常见的变量。

回答

0

当前脚本在Groovy中使用@BaseScriptGroovyShell进行解析的方式不能修改在父级脚本类中声明的变量的值。

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

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

+0

会在编译器配置中以相同的方式设置基本脚本? – kaotikmynd

+0

是的,它的行为方式相同。 –