在动态模型编程里规定模型就是对象,每一个模型都是对象。
动态模型编程规定每一个模型都是可执行的,它们可以转化为动作来执行。
一个模型的属性和子节点是这个模型对象的属性。
<?xml version="1.0" encoding="utf-8"?> <Shell name="HelloWorld" descriptors="xworker.swt.widgets.Shell" text="Hello World" width="640" height="480"> <FillLayout name="FillLayout"></FillLayout> <Browser name="Browser" url="http://www.x-meta.org"></Browser> </Shell>
比如在上面的模型代码中,<Shell .../>、<FillLayout .../>和<Browser .../>是三个不同的对象,其中对象<Shell .../>包含name、descriptors、text、height、height和<FillLayout .../>、<Browser .../>等属性。
由于动作定义了任何模型都是可执行的,所有我们把一个模型的某些特殊子节点当作它的行为。
<?xml version="1.0" encoding="utf-8"?> <Person name="Tom" descriptors="_local.test.oo.Person" age="40"> <actions descriptors="xworker.lang.MetaThing/@actions"> <GroovyAction name="hello" code="println "Hello World!";"></GroovyAction> </actions> </Person>
动态模型规定一个模型的第一个标签名为actions的子节点中的子节点是模型对象的行为定义,所以在上面的模型代码<Person name="Tom" .../>这个对象模型有一个名为hello的行为,它是使用GroovyAction(Groovy脚本)编写的。
模型的描述者可以作为模型对象的类。
<thing name="Person"/>
<Person name="Tom" descriptors="Person"/>
比如在上面的模型代码中,<thing name="Person"/>是<Person name="Tom" descriptors="Person"/>的类,它们的关系是通过descriptors属性指定的。
动态模型编程中的面向对象的完整定义如下。
在动态模型里,一个对象可以继承除自身之外的任何对象,一个对象可以继承任意多个对象。如果一个对象A继承了对象B,那么对象A继承对象B的行为,但不继承对象B的属性和子节点。
<thing name="Person" extends="Animal"/>
继承使用extends属性来表示,比如上面的XML里Person继承了Animal。
在动态模型里使用描述者这个概念代替了类的概念,并且一个对象可以有任意个描述者,一个对象的描述者还可以是自己。如果对象B是对象A的描述,那么对象A继承对象B的行为,并且通常对象B是对象A的结构定义。
在动态模型里描述者的作用是描述一个对象是什么、有哪些属性和行为等。
在动态模型里继承只继承行为而并不继承属性和子节点等,但如果继承是类之间的继承,那么在逻辑上可以继承类的定义,比如属性、子节点和行为的定义。
比如Tom是Person,而Person继承了Animal,如果Animal定义了skin属性,Person定义了language属性,那么Tom就有skin和language两个属性,即属性的定义是可以继承的。
Copyright © 2007-2017 XWorker.org 版权所有