继承也是事物之间一种关系,在动态模型语言里,一个事物可以继承除自身外的其它任何事物,继承主要体现在行为的继承上,如果事物B继承了事物A,那么事物B则继承了事物A的行为,此时事物B就拥有了事物A的各种行为。
事物之间的继承关系是一个辅助功能,使用继承可以方便的定义复杂的事物。
继承是通过设置事物的extends属性来实现的,比如以下代码:
//事物A和B Thing a = new Thing(); a.put("name", "A"); Thing b = new Thing(); b.put("name", "B"); //设置A继承B,b.getMetadata().getPath()是B在world中的路径 a.put("extends", b.getMetadata().getPath());
本示例的相关代码文件有:Animal.xer.xml、PersonExtendAnimal.xer.xml、PersonExtend.xer.xml和PersonExtendTest.java。在X-Meta引擎的源码中可以找到。
Animal.xer.xml定义的代码如下。
<thing name="Animal"> <actions name="actions" descriptors="actions"> <JavaAction name="eat" useOuterJava="true" descriptors="JavaAction" methodName="animalEat" outerClassName="org.xmeta.example.PersonExtendTest"/> </actions> </thing>
PersonExtendAnimal.xer.xml中定义了Person,代码如下。
<thing name="Person" extends="org.xmeta.example.Animal"> <actions name="actions" descriptors="actions"> <JavaAction name="run" useOuterJava="true" descriptors="JavaAction" methodName="run" outerClassName="org.xmeta.example.PersonWithActionTest"/> </actions> </thing>
PersonExtend.xer.xml中定义了事物Tom,Tom的描述者是Person,代码如下。
<Person name="Tom" age="40" descriptors="org.xmeta.example.PersonExtendAnimal"> <Child name="Smith" age="10"/> </Person>
PersonExtendTest.java是运行测试代码,具体如下。
package org.xmeta.example; import org.xmeta.ActionContext; import org.xmeta.Thing; import org.xmeta.World; public class PersonExtendTest { public static void animalEat(ActionContext actionContext){ Thing self = (Thing) actionContext.get("self"); System.out.println(self.get("name") + " is eatting......"); } public static void main(String args[]){ //初始化World,World是获取事物的容器 World world = World.getInstance(); world.init("."); //获取PersonDescriptor.xer.xml定义的事物 Thing person = world.getThing("org.xmeta.example.PersonExtend"); person.doAction("run"); //eat是Person继承了Animal的方法 person.doAction("eat"); } }
在这里org.xmeta.example.PersonExtend是事物Tom,tom的run和eat行为都是有效的。
Copyright © 2007-2014 XWorker.org 版权所有