继承也是事物之间一种关系,在动态模型语言里,一个事物可以继承除自身外的其它任何事物,继承主要体现在行为的继承上,如果事物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 版权所有