动作相当于传统编程中的函数和方法,所以动作是可以执行的。动态模型编程认为每一个事物都可以是动作,所以动作是通过事物转化而来的。
需要注意的是动态模型认为任何事物都可以转化为动作,但并不保证任何一个动作都可以正确执行,具体需要参看动作的执行原理。
在X-Meta引擎中动作对应的类是:
以下代码演示了动作和程序的关系:
//事物 Thing thing = new Thing(); //动作,任何事物都可以转化为动作 Action action = thing.getAction(); //动作可以执行 action.run();
如果一个动作属于某个事物,那么我们就把它当作这个事物的行为,比如一个事物的名为ations子事物下的所有子事物一般是它的各种行为定义事物。
行为是属于事物的,因此一般通过事物来调用:
//事物 Thing thing = new Thing(); //执行它的行为 thing.doAction("actionName");
本示例的代码主要有:PersonWithAction.xer.xml和PersonWithActionTest.java。在X-Meta引擎的源码中可以找到。
在这里我们只讲行为的定义,因为任何事物都可以转化为动作,所以不需要专门讲动作的定义了,事物即动作。
行为的定义在PersonWithAction.xer.xml。
<Person name="Tom" age="40"> <Child name="Smith" age="10"/> <actions name="actions" descriptors="actions"> <JavaAction name="run" useOuterJava="true" descriptors="JavaAction" methodName="run" outerClassName="org.xmeta.example.PersonWithActionTest"/> </actions> </Person>
在这里Person的第一个事物名为actions的子节点是<actions name="actions" descriptors="actions">,它下面的<JavaAction name="run"...../>是行为的定义。
由于任何事物都可以转化为动作,所以actions节点下的事物可以是任意事物,并不一定是JavaAction,JavaAction是使用Java定义的动作,还可以使用GroovyAction、LuaAction、PythonAction或其他可以当做动作的事物等。
可以在Java代码中执行动作和行为,见下面的代码。
package org.xmeta.example; import org.xmeta.Action; import org.xmeta.ActionContext; import org.xmeta.Thing; import org.xmeta.World; public class PersonWithActionTest { /** * 事物的行为实现。 * * @param actionContext */ public static void run(ActionContext actionContext){ Thing self = (Thing) actionContext.get("self"); //属性 System.out.println("name=" + self.get("name")); System.out.println("age=" + self.get("age")); //子事物 for(Thing child : self.getChilds()){ System.out.println("child name=" + child.get("name")); System.out.println("child age=" + child.get("age")); } } public static void main(String args[]){ //初始化World,World是获取事物的容器 World world = World.getInstance(); world.init("."); //获取Perxon.xer.xml定义的事物 Thing person = world.getThing("org.xmeta.example.PersonWithAction"); person.doAction("run"); //Person也可以转化为动作执行,不过这里执行会出现异常,因此action直接执行是不包含self变量 Action action = person.getAction(); action.run(); } }
在4中的例子里,最后执行动作会抛出异常,这是因为动作在执行时没有self变量,而行为执行时有self变量。
这里的self变量相当于Java中的this变量,当一个动作被当做行为执行时那么它所属的事物(对象)本身就会以self为变量名放入到变量上下文中,而仅仅当做动作执行时则没有这个操作。
Copyright © 2007-2014 XWorker.org 版权所有