2015-12-14 84 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

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