雪原xy 发表于 2018-12-25 10:37:45

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

一个可以显示在屏幕上一例子!!
//向上转换;
//文档类;
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());
                }
        }
}

雪原xy 发表于 2018-12-25 10:45:53

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

雪原xy 发表于 2018-12-25 10:48:06

不过向上转换是明白了,说白了就是把子类当父类使用!!

TKCB 发表于 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文件),指的是函数本身。


雪原xy 发表于 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)