Introduction to Classes and Object Ortented Programming
出自OpenFace
第十一章 类和面向对象编程介绍
第二部分 教程介绍
目录 |
介绍
LZX是面向对象,以原型继承为基础,能创建自定义和重复使用的class从而能减少代码。
这一章告诉您如何去定义和实例化类,以及如何使用它。<class>标签用于定义类,使用时需要实例化该类。
Example 11.1. 一个简单类的例子
<canvas width="500" height="80"> <class name="MyClass" width="80" height="25" bgcolor="#CFD9AB"> <text>Hello, World!</text> </class> <MyClass name="myFirstInstance"/> </canvas>
<class>标签定义了类,<MyClass>标签实例化了该类。类中定义的一切通过创建它的实例而被继承,也就是说,Myclass的实例继承了: 'width'属性值为 80,'height' 属性值为25,'bgcolor',还有一些text,该实例命名为"myFirstInstance", 同样的我们可以命名一个view。
在这个例子中,类中只有一个元素(<text> 元素),但是类可以包含很多对象,例如,view(视图)可以包含很多子视图。
id属性
注意不在类的定义中定义id属性是很重要的,因为每个id都应该是唯一的。ids 是全局的,如果你要在类的定义中包含定义id属性,那么类的多个实例就会产生几个相同id的视图,这会产生不可预知的行为。
继承
如上所述,<MyClass>的实例会继承它,由于我们在类的定义时没有指明x,y的位置,这不意味着我们不可以通过实例给它们赋值。
该实例具有象视图一样行为,事实上,是由于我们继承了view类,默认情况下,<class> 继承view类。
<class name="MyClass">
… 相同…
<class name="MyClass" extends="view">
由此得到你可以继承你想要继承的任何类的结论:
Example 11.2. 继承<text>
<canvas width="500" height="80">
<class name="SpecialButton" extends="text" oninit="changeLabel()">
<method name="changeLabel">
this.setAttribute('text', 'First! ');
</method>
</class>
<SpecialButton>Now second</SpecialButton>
</canvas>
在实例中属性,方法可以重写:
Example 11.3. 重写方法
<canvas width="500" height="80">
<class name="SpecialButton" extends="text" oninit="changeLabel()">
<method name="changeLabel">
this.setAttribute('text', 'First!');
</method>
</class>
<simplelayout axis="y" spacing="10"/>
<SpecialButton>Not First</SpecialButton>
<SpecialButton>
Now second!
<method name="changeLabel">
this.setAttribute('text', 'Smashing!');
</method>
</SpecialButton>
</canvas>
使用自定义和预定义的类时重写方法都是非常方便的,但并不适合类的不同实例需要不同参数的情况。
属性
之前已经使用过属性,但这些是我们在类中继承的已有的属性,前面提到过,能够在创建类的实例时传递参数是很有用处的:
Example 11.4. 定义类的属性
<canvas width="500" height="80">
<class name="SpecialButton" extends="text" oninit="changeLabel()">
<attribute name="changeToLabel" value="First!" type="string"/>
<method name="changeLabel">
var newLabel = this.getAttribute('changeToLabel');
this.setAttribute('text', newLabel);
</method>
</class>
<simplelayout axis="y" spacing="10"/>
<SpecialButton>Now Next</SpecialButton>
<SpecialButton changeToLabel="Thank You!">show me!</SpecialButton>
</canvas>
如果给attriubte标签设置value属性的值,那么该值就是它的默认值,这样在实例化时如果没有设定值,它就采用这个值作为缺省的值。
重复继承
可以多次继承一个类,例如,一个应用可以包含多种text:
Example 11.5. 重复继承
<canvas width="800" height="300">
<class name="MyText" extends="text" oninit="changeLabel()">
<method name="changeLabel">
this.setAttribute('text', 'First! ');
</method>
</class>
<class name="MySpecialText" extends="MyText"/>
<view name="t" x="15" y="5">
<simplelayout axis="y" spacing="10"/>
<MyText>MyText</MyText>
<MySpecialText oninit="changeLabel()"/>
</view>
</canvas>

