多态之:向上转换(小练习)
一个可以显示在屏幕上一例子!!//向上转换;
//文档类;
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());
}
}
}
做了这么多练习,终于可以把图形画在屏幕上了!!但是有好多不明白的地方,
先记下来,以后探究:
1、构造函数不可被子类继承,必须要用super来引用;
2、Shape,DisplayObjectContainer这两个类不太懂,好像是用来画图的;
3、Math,Graphics等类中的方法,第二个单词的首字母大写,可能是一个规定;
4、stage是什么东东也不明白,thisJ是怎么引用也不懂;
本练习是从教材中默写下来的,太多不明白的地方…… 不过向上转换是明白了,说白了就是把子类当父类使用!! 本帖最后由 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文件),指的是函数本身。
TKCB 发表于 2018-12-25 11:04
1、构造函数不可被子类继承,必须要用super来引用;
是的
话不多说,两个字:多谢!!!
页:
[1]