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

搜索
查看: 2088|回复: 4
上一主题 下一主题

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

[复制链接] TA的其它主题
发表于 2018-12-25 10:37:45 | 显示全部楼层 |阅读模式

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

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

x
一个可以显示在屏幕上一例子!!
[Actionscript3] 纯文本查看 复制代码
//向上转换;
//文档类;
package 
{
	import flash.display.Sprite;
	import flash.display.Stage;
	import son.Shaperect;
	import son.Shapecircle;
	import son.Shapeellipse;
	import son.Shapedraw;
	public class doc extends Sprite
	{
		public function doc()
		{//若在构造器中先实例化各个图形,生成的各个图形的位置在同一处;
/*			var _shaperect:Shaperect = new Shaperect(this);
			var _shapecircle:Shapecircle = new Shapecircle(this);
			var _shapeellipse:Shapeellipse = new Shapeellipse(this);
			var _shapedraw:Shapedraw = new Shapedraw(this);

*/			
//用for循环来生成50个位置不同大小不同的图形;
for (var i:int=0; i<50; i++)
			{

				var randi:Number = Math.random();
				trace(i);
				if (randi<0.3)
				{
					randdraw( new Shaperect(this));
				}
				else if (randi<0.7)
				{
					randdraw(new Shapecircle(this));
				}
				else
				{
					randdraw(new Shapeellipse(this));
				}
			}
		}
		private function randdraw(sh:Shapedraw)
		{
			sh.shapefill(Math.random()*0xFFFFFF);//填充随机的颜色;
			sh.shapemove(stage.stageWidth*Math.random(),stage.stageHeight*Math.random());//摆放随机的位置;
		}
	}
}

//向上转换
//定义一个父类:Shapedraw;
package son
{
	import flash.display.Shape;//导入画图工具:
	import flash.display.DisplayObjectContainer;//导入容器类:
	public class Shapedraw
	{
		protected var _shape:Shape;
		public function Shapedraw(ds:DisplayObjectContainer)
		{
			_shape=new Shape();
			ds.addChild(_shape);//把画的图放入容器中;
		}
		protected function shapedraw()
		{//画图方法不写,方便后面的子类重写方法
		}
		//填充方法;
		public function shapefill(e:uint)
		{
			_shape.graphics.beginFill(e,Math.random());
			shapedraw();
			_shape.graphics.endFill();
		}
	//摆放位置方法;
		public function shapemove(ex:Number,ey:Number)
		{
			_shape.x = ex;
			_shape.y = ey;
		}
	}
}
//子类:Shaperect;
package son
{
	import flash.display.DisplayObjectContainer;

	public class Shaperect extends Shapedraw
	{
		public function Shaperect(ds:DisplayObjectContainer)
		{
			super(ds);//用super来调用父类的构造函数;
		}
		//重写画图方法,画矩形
		override protected function shapedraw()
		{
			_shape.graphics.drawRect(0,0,_shape.stage.width*0.25*Math.random(),_shape.stage.height*0.25*Math.random());
		}
	}
}

//子类:Shapecircle;
package son
{
	import flash.display.DisplayObjectContainer;

	public class Shapecircle extends Shapedraw
	{
		public function Shapecircle(ds:DisplayObjectContainer)
		{
			super(ds);//用super来调用父类的构造函数;
		}
		//重写画图方法,画圆

		override protected function shapedraw()
		{
			_shape.graphics.drawCircle(0,0,_shape.stage.width*0.2*Math.random());
		}
	}
}

//子类:Shapeellipse;
package son
{
	import flash.display.DisplayObjectContainer;


	public class Shapeellipse extends Shapedraw
	{
		public function Shapeellipse(ds:DisplayObjectContainer)
		{
			super(ds);//用super来调用父类的构造函数;
		}
		//重写画图方法,画椭圆

		override protected function shapedraw()
		{
			_shape.graphics.drawEllipse(0,0,_shape.stage.width*0.25*Math.random(),_shape.stage.height*0.25*Math.random());
		}
	}
}

 楼主| 发表于 2018-12-25 10:45:53 | 显示全部楼层
做了这么多练习,终于可以把图形画在屏幕上了!!但是有好多不明白的地方,
先记下来,以后探究:
1、构造函数不可被子类继承,必须要用super来引用;
2、Shape,DisplayObjectContainer这两个类不太懂,好像是用来画图的;
3、Math,Graphics等类中的方法,第二个单词的首字母大写,可能是一个规定;
4、stage是什么东东也不明白,thisJ是怎么引用也不懂;
本练习是从教材中默写下来的,太多不明白的地方……
回复

使用道具 举报

 楼主| 发表于 2018-12-25 10:48:06 | 显示全部楼层
不过向上转换是明白了,说白了就是把子类当父类使用!!
回复

使用道具 举报

发表于 2018-12-25 11:04:25 | 显示全部楼层
本帖最后由 TKCB 于 2018-12-25 12:58 编辑

1、构造函数不可被子类继承,必须要用super来引用;
是的

2、Shape,DisplayObjectContainer这两个类不太懂,好像是用来画图的;
Shape是矢量图类(可显示在舞台上面的)
但真正画图的是Graphics 绘制,它本身无法显示在舞台上。这就像是 Graphics 是一个植物人作家,他的无法表达自己的想法,必须通过印刷到纸、网络网站、各种承载物品,才可以呈现出来他的小说,他的想法。而承载他小说的是最直接的是Shape,其次还有Sprite 、MovieClip等等……

DisplayObjectContainer这个有名字的翻译可以看出来,是显示对象容器类,他是抽象类,不能直接使用,必须用他的子类,例如:Sprite、MovieClip(最熟悉的影片剪辑)

3、Math,Graphics等类中的方法,第二个单词的首字母大写,可能是一个规定;
方法、属性名字的问题,其实就是命名规则,不是强制的,只是大家的一个约定,就像A4纸的大小全世界都一样,只是约定,不是强制的。
aaaBbbCcc  小骆驼峰命名
AaaBbbCcc  大骆驼峰命名
aaa_bbb_ccc    小长城命名
AAA_BBB_CCC    大长城命名
其他命名~~也有很多,其实看个人喜好了。。

4、stage是什么东东也不明白,thisJ是怎么引用也不懂;
stage 是舞台对象。。
this 在类中就是 指的 类的实例对象本身。
this 在单独的函数中(没有类的as文件),指的是函数本身。


回复

使用道具 举报

 楼主| 发表于 2018-12-25 12:56:56 | 显示全部楼层
TKCB 发表于 2018-12-25 11:04
1、构造函数不可被子类继承,必须要用super来引用;
是的

话不多说,两个字:多谢!!!
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /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)



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