分享
 
 
 

FlashAS学习:构造函数小结

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

一、构造函数的差别性

构造函数是一个特殊的成员函数,与成员函数具有共同性和差别性。例如:构造函数与成员函数一样,通过function关键字来定义,可以声明为private或public,可以在构造函数中加入参数等。

一、构造函数的差别性主要体现在:

l构造函数名与类名必须相同,并且区分大小写;

l构造函数不能声明为static,它只能是private或public;

l构造函数中不能使用return语句返回一个值;

l构造函数不能返回指定的数据类型;

当违反以上规则时,flash会在输出面板提示相应的信息。

1、在下面的Load类我们定义一个成员函数load:

classLoad{

functionload(){

}

}

进行语法检查时,flash会提示以下的信息:

成员函数“load”与定义的类的名称“Load”大小写不同,在运行时将被视为类构造函数。

2、如果我们在构造函数中声明了static属性:

classLoad{

staticfunctionLoad(){

}

}

flash将提示:

允许用于构造函数的属性只有public和private

3、如果我们在构造函数中使用了return语句返回一个值:

classLoad{

vari=0;

functionLoad(){

returni;

}

}

flash将提示:

构造函数不能返回值

4、如果我们在构造函数中返回了一个数据类型:

classLoad{

functionLoad():Load{

}

}

flash将提示:

构造函数不能指定返回类型

二、构造函数的返回值

虽然在构造函数中不能用return返回一个值,但构造函数有返回值,它返回的是为该类的实例。

如:

classLoad{

functionLoad(){

}

functiontoString():String{

return"Load类的实例";

}

}

测试方法:

trace(newLoad());

在输出面板中输出:

Load类的实例

在类中加入toString方法的原因:

当Load类的对象作为字符串对待时,toString()方法会自动调用,这个方法在使用trace()调试类的属性、实例等时非常有用,所以在有构造函数的类里面,一般都配有toString()方法,位置放在构造函数的后面。

如果没有toString()方法,测试结果可不是我们想要:

[objectObject]

在创建类的实例时,一般都要指定一个实例名:

vart:Load=newLoad();

以上的代码的执行过程:

l创建一个Load类的对象,并为该对象分配存储空间。

l调用Load类的构造函数,初始化这个新建的对象。

l声明一个Load类的实例的引用t即实例名,使其指向这个新的对象。

通过实例名就可以使用实例属性和实例方法:

实例名.属性

实例名.方法名()

三、构造函数的参数传递

当用构造函数创造类的实例时,常常要初始化一些类的属性,这些属性通常用构造函数的参数来传递。

classToolTip{

privatevar_str:DrawString;

privatevar_shape:Shape;

publicfunctionToolTip(str:DrawString,shape:Shape){

_str=str;

_shape=shape;

}

//设置和获取属性的代码

}

如果参数名与属性名相同,可以使用this关键字来指向类的实例,通过点语法把参数传递进来:

classToolTip{

privatevarstr:DrawString;

privatevarshape:Shape;

publicfunctionToolTip(str:DrawString,shape:Shape){

this.str=str;

this.shape=shape;

}

}

使用:

vart:ToolTip=newToolTip(str,rect);

在构造函数的参数传递中,也存在着地址传递和数值传递的问题,这特别要引起注意。如下面两个参数不同传递方式的例子:

地址传递:

classBox{

functionBox(a:Array){

a[0]=5;

trace(a[0]);

}

}

vara=["1"];

vart:Box=newBox(a);

trace(a[0]);

//5

//5

数值传递:

classBox{

functionBox(a){

a=5;

trace(a);

}

}

vara=1

vart:Box=newBox(a);

trace(a);

//5

//1

关于参数传递的原理可参考书

在as2中,不支持构造函数的重载,即在一个类中定义多个构造函数,但可以通过条件语句进行模拟(实际上只有一个构造函数),通过对参数的判断如参数的类型的检查来执行不同的代码。在flash中,Array类的构造函数可以接受不同的参数,产生不同的实例,我想实现方法应与此类似。

四、空构造函数和私有构造函数

如果在一个类里含有一个空构造函数(默认是public的,见上面的第1个例子),意为这个类不需要初始化,因为一个类的初始化代码一般都放在构造函数中。但空构造函数也有可能是一个没有完成的构造函数,在编写其它类代码后,将会在构造函数中补充代码,这也是编程常用的方法。

在一个类里面,如果没有定义构造函数,as2会创建一个空构造函数,所以一个空构造函数在as2里意义不大,但如果一个空构造函数被声明为private,它就具有重大的意义。

1、抽象类中的私有构造函数

首先私有构造函数能保证不能在外部通过new关键字被实例化,因为抽象类被实例化是没有意义的。在抽象类里面,一般定义了子类所需的统一方法,而抽象类本身只做为一个统一的数据类型使用,它的实例化都要延迟到子类。

例如:在flash的绘图中,颜色填充的方式有三种:固体填充、直线渐变填充和放射渐变填充。如果我们要写一个填充类,最好的方法是先创建一个抽象类,让三种具体的填充类来继承这个抽象类,这样,三个具体类就具有了相同的数据类型和统一的接口方法。

下面是代码示例:

//抽象类

classBrush{

privatefunctionBrush(){

}

publicfunctionfill(target:MovieClip){

}

}

//固体填充类

classSolidBrushextendsBrush{

functionSolidBrush(color,alpha){

}

publicfunctionfill(target:MovieClip){

}

}

//直线渐变填充类

classLinerBrushextendsBrush{

functionLinerBrush(参数){

}

publicfunctionfill(target:MovieClip){

}

}

使用可把实例名的类型定义为Bursh,但具体的实例可以是三个里面的任意一个:

varb:Brush=newSolidBrush();

b.fill();

//

varb:Brush=newLinerBrush();

b.fill();

2、具体类中的私有构造函数

这种情况最常见的是在单例模式中,在单例模式中,一个类只能自己创建一个唯一的实例。如下面是一个代码示例:

classLoad{

privatestaticvar_instance:Load;

privatefunctionLoad(){

}

publicstaticfunctiongetInstance():Load{

if(Load._instance==undefined){

returnLoad._instance=newLoad();

}

}

}

使用:

vart:Load=Load.getInstance()

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有