动态模型的编程方法是面向对象的,在动态模型编程里用描述者代替了类的概念,所以事物之间的描述关系就是对象和它的类之间的关系,因此一个对象的类在动态模型编程中就称为它的描述者。
下面是描述者的主要功能。
类的一个作用是用于说明对象是什么,比如用人是张三的类,那么可以说张三是一个人。同样的道理如果我们把一个名字叫人的模型作为名字叫做张三这个模型的描述者,那么就可以说张三是一个人。
动态模型语言认为类和对象的关系并不是固定不变的,比如上面说的张三可能只是一个石头,或者它和它还可以冠以男人、工人和丈夫等类别,并且有些类别也是可以随时加上或取消的。
其实在现实中我们对一个事物的认知是会发生变化的,对一个事物的理解也不是固定的,而动态模型编程的动态性就体现了这一点。
在面向对象编程中一个类中所定义的方法和行为也是它的对象实例的方法和行为,描述者也具有同样的功能,一个事物也继承其描述者的行为。
在面向对象编程中类也是其对象实例的结构定义,描述者同样也是如此。一般情况下一个描述者可以说明一个事物具有那些属性和行为等,和Java等面向对象编程一样,一个类的描述能力是有限的,通常用多个类来描述一个对象,这可以通过类之间的继承关系来实现。
名字是事物的一个重要属性,事物的属性name一般叫做事物的名字,而事物的描述者的名字一般叫做事物名。
比如我们说一个人叫张三,那么张三是他的名字,人则是它的事物名。
描述者的示例代码:
//创建事物A和B Thing a = new Thing(); a.put("name", "A"); Thing b = new Thing(); b.put("name", "B"); //设置B为A的描述者,b.getMetadata().getPath()是b在world中的路径 a.put("descriptors", b.getMetadata().getPath()); //同时也可以设置A为B的描述者 b.put("descriptors", a.getMetadata().getPath());
本示例的代码有:PersonWithAction.xer.xml、PersonDescriptor.xer.xml和PersonDescriptorTest.java。在X-Meta引擎的源码中可以找到。
描述者的定义是PersonWithAction.xer.xml,代码如下。
<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>
在这里需要注意的是任何事物都可以当做描述者,描述关系不是事物之间的固有关系,因此任何事物都可以当做描述者来使用。
在这里我们定义一个ZhangSan的事物,它使用Person作为描述者(类),代码文件是PersonDescriptor.xer.xml,具体代码如下。
<Person name="ZhangSan" age="40" descriptors="org.xmeta.example.PersonWithAction"> <Child name="XiaoMing" age="10"/> </Person>
在这里属性descriptors="org.xmeta.example.PersonWithAction"指向的描述者的路径。
在这里ZhangSan使用了Person作为描述者,因此它也拥有Person的行为,代码文件是PersonDescriptorTest.java,具体代码如下。
package org.xmeta.example; import org.xmeta.Thing; import org.xmeta.World; public class PersonDescriptorTest { public static void main(String args[]){ //初始化World,World是获取事物的容器 World world = World.getInstance(); world.init("."); //获取PersonDescriptor.xer.xml定义的事物 Thing person = world.getThing("org.xmeta.example.PersonDescriptor"); person.doAction("run"); } }
运行测试代码后可以看到ZhanSan虽然没有定义run方法,但它的描述者Person定义了,因此ZhanSan还是可以正确执行run的行为。
Copyright © 2007-2014 XWorker.org 版权所有