分享
 
 
 

Flash AS学习:构造函数小结

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

一、构造函数的差别性

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

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

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

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

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

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

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

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

class Load {

function load() {

}

}

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

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

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

class Load {

static function Load() {

}

}

flash将提示:

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

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

class Load {

var i = 0;

function Load() {

return i;

}

}

flash将提示:

构造函数不能返回值

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

class Load {

function Load():Load {

}

}

flash将提示:

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

二、构造函数的返回值

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

如:

class Load {

function Load() {

}

function toString():String {

return "Load类的实例";

}

}

测试方法:

trace(new Load());

在输出面板中输出:

Load类的实例

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

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

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

[object Object]

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

var t:Load = new Load();

以上的代码的执行过程:

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

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

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

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

实例名.属性

实例名.方法名()

三、构造函数的参数传递

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

class ToolTip {

private var _str:DrawString;

private var _shape:Shape;

public function ToolTip(str:DrawString, shape:Shape) {

_str = str;

_shape = shape;

}

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

}

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

class ToolTip {

private var str:DrawString;

private var shape:Shape;

public function ToolTip(str:DrawString, shape:Shape) {

this.str = str;

this.shape = shape;

}

}

使用:

var t:ToolTip=new ToolTip(str, rect);

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

地址传递:

class Box {

function Box(a:Array) {

a[0] = 5;

trace(a[0]);

}

}

var a = ["1"];

var t:Box = new Box(a);

trace(a[0]);

//5

//5

数值传递:

class Box {

function Box(a) {

a = 5;

trace(a);

}

}

var a = 1

var t:Box = new Box(a);

trace(a);

//5

//1

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

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

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

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

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

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

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

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

下面是代码示例:

//抽象类

class Brush {

private function Brush() {

}

public function fill(target:MovieClip) {

}

}

//固体填充类

class SolidBrush extends Brush {

function SolidBrush(color, alpha) {

}

public function fill(target:MovieClip) {

}

}

//直线渐变填充类

class LinerBrush extends Brush {

function LinerBrush(参数) {

}

public function fill(target:MovieClip) {

}

}

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

var b:Brush=new SolidBrush();

b.fill();

//

var b:Brush=new LinerBrush ();

b.fill();

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

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

class Load {

private static var _instance:Load;

private function Load() {

}

public static function getInstance():Load {

if (Load._instance == undefined) {

return Load._instance=new Load();

}

}

}

使用:

var t: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- 王朝網路 版權所有