2013-10-11 2 views
4

Вот скрипт (Scccc.groovy):Может ли groovy-скрипт наследовать от Java или Groovy-суперкласса?

import scriptParents.ScriptGroovyParent 

println(queryThisBaby("my query")); 

и вот суперкласс:

class ScriptGroovyParent { 

    public ScriptGroovyParent() { 
     // TODO Auto-generated constructor stub 
    } 

// public String queryThisBaby(String query){ 
//  
//  return query +" was run."; 
// } 

    def queryThisBaby(name) { 
     return name +" was run." 
    } 
} 

Я получаю сообщение об ошибке, хотя при попытке запустить скрипт.

Caught: groovy.lang.MissingMethodException: No signature of method: scripts.Scccc.queryThisBaby() is applicable for argument types: (java.lang.String) values: [my query] 
groovy.lang.MissingMethodException: No signature of method: scripts.Scccc.queryThisBaby() is applicable for argument types: (java.lang.String) values: [my query] 
    at scripts.Scccc.run(Scccc.groovy:5) 

Как это может быть?

ответ

3

Сценарий может расширять базовый класс, используя CompilerConfiguration. Здесь предостережение заключается в том, что базовый класс должен расширять Script, поскольку строчные скрипты обычно расширяют Script, и вы не можете иметь множественное наследование в отношении «IS A».

//ScriptGroovyParent.groovy 
abstract class ScriptGroovyParent extends Script{ 
    def queryThisBaby(name) { 
     return name +" was run." 
    } 
} 


//Script Scccc.groovy 
import org.codehaus.groovy.control.CompilerConfiguration 

def configuration = new CompilerConfiguration() 
configuration.setScriptBaseClass("ScriptGroovyParent") 

def shell = new GroovyShell(this.class.classLoader, new Binding(), configuration) 

assert shell.evaluate("queryThisBaby('My Query')") == 'My Query was run.' 

Вы можете импортировать пакет, если они оба находятся в разных пакетах.

+0

спасибо, но как насчет @Override \t выполнения общественного объекта() { \t \t возвратного нуля; \t} из класса Script. –

+1

Это завышено в скрипте. Скрипт (общий скрипт вообще), который создает оболочку и оценивает выражение в приведенном выше случае, всегда будет выполняться и запускаться под 'run()' из Script. Если вы хотите убедиться, что это всегда делается именно так, а не от родителя, чем объявлять 'ScriptGroovyParent' как' abstract'. @AlexMills – dmahapatro

Смежные вопросы