11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 4089|回复: 10
上一主题 下一主题

[多态] 多态之:向下转换(小练习)

[复制链接] TA的其它主题
发表于 2018-12-26 09:52:24 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 雪原xy 于 2018-12-26 09:55 编辑

[Actionscript3] 纯文本查看 复制代码
//向下转换;
//把不同子类的实例放在一个只能存放父类的数组里(即先向上转换),再从该数组中取出每个元素并向下转换成对应的子类实例,并做适当的动作,展示转换成功。
package{
import flash.display.Sprite;
import flash.display.Stage;
import son.Shaperect;
import son.Shapecircle;
import son.Shapeellipse;
import son.Shapedraw;
public class downcastdoc extends Sprite{
private var _shapearray:Array=[];//把向上转换后的实例放在这个数组里;
//构造函数:取出_shapearray中的实例进行向下转换,并把转换后的实例按要求显示在舞台;
public function downcastdoc(){
geshapearray();//执行该方法,生成向上转换后的数组;
 var xshape:Shapedraw;//在for循环外定义一个父类型变量,用来接收取出来的实例;
for(var k:int=0;k<_shapearray.length;k++){//用下面的方法取出_shapearray中的实例;
xshape=_shapearray.pop();
//通过if语句判断取出的实例是哪个子类的实例,并用as进行向下转换;
if(xshape is Shaperect){
hrect(xshape as Shaperect);
}
if (xshape is Shapecircle){
hcircle(xshape as Shapecircle);
}
if(xshape is Shapeellipse){
hellipse(xshape as Shapeellipse);
}
}
}
//通过下面三个方法,把对应的子类实例按要求填充颜色并摆放不同的位置;
private function hrect(h:Shaperect):void{
h.shapefill(0x0000FF);
h.shapemove(stage.stageWidth*Math.random(),1/2*stage.stageHeight);
}
private function hcircle(ha:Shapecircle):void{
ha.shapefill(0x004455);
ha.shapemove(1/3*stage.stageWidth,stage.stageHeight*Math.random());
}
private function hellipse(han:Shapeellipse):void{
han.shapefill(0x880022);
han.shapemove(2/3*stage.stageWidth,stage.stageHeight*Math.random());
}
//定义一个生成实例的方法,并通过addshape方法推送给_shapearray数组;
private function geshapearray():void{
var addrand:Number;
for(var i:int=0;i<90;i++){
addrand=Math.random();
if(addrand<0.3){
addshape(new Shaperect(this));
}
else if(addrand<0.6){
addshape(new Shapecircle(this));
}
else{
addshape(new Shapeellipse(this));
}
}
}
//定义一个只能接收父类实例(即把子类向上转换)的推送方法,借助数组的push()方法,把参数中的实例放在数组的最后位置;
private function addshape(sh:Shapedraw):void{
_shapearray.push(sh);
}
}
}



本练习是在向上转换的基础上做的,父类和子类直接导入即可:
 楼主| 发表于 2018-12-26 12:56:57 | 显示全部楼层
总结:
1,向下转换前提是:先要向上转换,否则转化失败!
2,有两种方法可以实现向下转换:as运算符和强制转换…(子类型名称)();
3,写练习中的疑惑:
(1)for循环使用(;i<array.lengh;i++){array.pop()}不能抽取array的所有元素,只能抽取一半?
(2)在循环体内外定义变量,收到的效果不同?
(3)private在for循环中修饰变量会报错?
(4)stage是舞台但是它和容器有什么区别?
(5)数组不赋值就无法访问?
回复

使用道具 举报

发表于 2018-12-26 16:14:46 | 显示全部楼层
(1)  while(array.length > 0) {array.pop(); } 就对了
(2) 循环体内定义的变量,每次循环时都是重新赋值的
(3) private修饰的是类的成员,不要说循环体内了,在函数内都不应出现。
(4) stage是容器的一个特化的子类,只有一个(多窗口情况不讨论)。flash只会显示出放在stage上的显示对象。
(5) 要看类型的默认值。除了Number默认值是NaN, int和uint默认值是0,Boolean是false以外,大部分类型的默认值都是null。所有访问会发生什么你就知道了吧
回复

使用道具 举报

发表于 2018-12-26 16:26:52 | 显示全部楼层
本帖最后由 心羽 于 2018-12-26 16:27 编辑


这个图表示了显示对象类型之间的关系,在我初学阶段起了很大作用。从看的见的东西出发应该更容易一些。


这张图是显示列表。 Stage=舞台,在最根部。
文档类在次根部。一般后续的内容是自主加在文档类上的。
显示对象的容器,是可以承载其他显示对象的显示对象。
回复

使用道具 举报

 楼主| 发表于 2018-12-26 21:12:12 | 显示全部楼层
心羽 发表于 2018-12-26 16:14
(1)  while(array.length > 0) {array.pop(); } 就对了
(2) 循环体内定义的变量,每次循环时都是重新赋值的 ...

非常感谢,五句话!却是我无数次反复尝试也不能解决的难题!真省了我不少的功夫!
回复

使用道具 举报

发表于 2018-12-27 10:41:59 | 显示全部楼层
为啥你的方法命名全部都是小写的
回复

使用道具 举报

 楼主| 发表于 2018-12-27 12:54:22 | 显示全部楼层
浮生若梦 发表于 2018-12-27 10:41
为啥你的方法命名全部都是小写的

方法不是小写吗?好像类名才大写吧?
回复

使用道具 举报

发表于 2018-12-27 16:51:14 | 显示全部楼层
浮生若梦 发表于 2018-12-27 10:41
为啥你的方法命名全部都是小写的

private function setDataInfo():void{}  项目一般这样命名
回复

使用道具 举报

 楼主| 发表于 2018-12-27 17:21:23 | 显示全部楼层
浮生若梦 发表于 2018-12-27 16:51
private function setDataInfo():void{}  项目一般这样命名

哦,这个好像tkcb说过,没在意,谢谢!以后注意!!!
回复

使用道具 举报

发表于 2019-1-3 12:27:39 | 显示全部楼层

很棒,好帖子啊,必须顶一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表