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

标签 java variables inheritance groovy

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

通常,在 Groovy 或 Java 中扩展类时,只要子类可以访问该变量并且不是最终变量,该子类就可以对其进行修改。然而,当在 Groovy 中扩展基本脚本时,子类可以读取继承的变量并为其赋值,而编译器不会提示,但每当其他方法访问该变量时,它们都会获取在父类中设置的值。

我尝试使用静态和实例 block 为变量赋值,但似乎都不起作用。

以下脚本是将在 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 中使用 @BaseScriptGroovyShell 解析脚本的方式,您无法修改父脚本类中声明的变量的值。

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

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

关于java - 如何修改/覆盖从 Groovy 基本脚本继承的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34274860/

相关文章:

java - 生成的RSA公钥和私钥模数在Java/Android中是一样的

javascript - 将 javascript 变量存储在数组中

java - Java中三元运算符中的char转换,打印int值而不是char值

java - 将一个数字添加到固定的最大数字

java - 如何在 bundle 中传递 list<>

c++ - 为什么我不能调用 QWidget::isVisible() 的继承版本?

c++ - 创建父类(super class)的指针数组以堆分配继承类

javascript - 如何调用在 javascript 变量中定义的函数

c - 如何在 C 中重新定义变量?

Java父类(super class)扩展