AS3中向上转换例子,里氏代换原则
1、多态(Polymorphism),即多种形态。所谓形态,具体是指数据类型(Data Type)。一个对象的数据类型包括自己所属类、自己父
下例中,3个自定义的图形绘制类和一个文档类SampleUpcast,一个是父类KingdaShape,其余圆形类Circle和矩形类Rect都是KingdaShape的子类。 文档类SampleUpcast中,有一个实例方法randomShape(),用来将KingdaShape类型对象在舞台上随机摆放位置。 我们在SampleUpcast的构造函数中,通过运行时随机数,随机生成Circle类和Rect类的对象,并传给randomShape()。 文档类SampleUpcast package sample.polymorphism { /** * ... * @author ... */ import flash.display.Sprite; import flash.display.Stage; //由于KingdaShape、Circle、Stage在同一包中,所以不需要导入 public class SampleUpcast extends Sprite { public function SampleUpcast() { //生成50个形状 for (var i:int = 0; i < 50; i++ ) { //生成一个随机数Math.random() //大于0.5,则生成一个Circle对象传给randomShape() //否则,生成一个Rect对象传给randomShape() if (Math.random() > 0.5) { randomShape(new Circle(this)); }else { randomShape(new Rect(this)); } } } //只接受KingdaShape类的对象,并在舞台上将传入的对象随机摆放 private function randomShape(target:KingdaShape):void { //生成随机的颜色值 var rand:uint = Math.random() * 0xFFFFFF; //生成随机的x,y坐标 var posX:Number = stage.stageWidth * Math.random(); var posY:Number = stage.stageHeight * Math.random(); target.fill(rand); target.move(posX,posY); } } }
package sample.polymorphism { /** * ... * @author ... */ import flash.display.Shape; import flash.display.DisplayObjectContainer; import flash.text.engine.BreakOpportunity; public class KingdaShape { protected var _shape:Shape;//复合了一个Shape类对象_shape(复合:把几个类复合到一个类中。懒汉式初始化(使用时才初始化)。复合是同生共死,聚合是各安天命) //传入一个MovieClip或者Sprite作为_shape的父容器 public function KingdaShape(parent:DisplayObjectContainer) { _shape = new Shape(); parent.addChild(_shape); //加上这一句,屏幕才会显示_shape } //绘制 protected function draw() : void { //放空,供子类重写 } //填色 public function fill(color:uint):void { _shape.graphics.beginFill(color,Math.random());//填充颜色 draw(); _shape.graphics.endFill();//结束填充 } //移动 public function move(x:Number,y:Number):void { _shape.x = x; _shape.y = y; } } } 圆形类Circle package sample.polymorphism { /** * ... * @author ... */ import flash.display.DisplayObjectContainer; //自定义的圆形类 public class Circle extends KingdaShape { public function Circle(parent:DisplayObjectContainer) { super(parent); } //重写父类的图形绘制方法 override protected function draw():void { //画一个随机半径的圆,半径为0到1/5的舞台宽度,_shape在父类中已定义,protected可以直接被子类使用 _shape.graphics.drawCircle(0,_shape.stage.width*0.2*Math.random()); } } } 矩形Rect类 package sample.polymorphism { /** * ... * @author ... */ import flash.display.DisplayObjectContainer; //自定义的矩形类 public class Rect extends KingdaShape { public function Rect(parent:DisplayObjectContainer) { super(parent); } //重写父类的图形绘制方法 override protected function draw():void { //绘制一个宽度高度随机的矩形,宽度高度不超过舞台的宽度高度的1/4,_shape在父类中已定义,protected可以直接被子类使用 _shape.graphics.drawRect(0,_shape.stage.width * 0.25 * Math.random(),_shape.stage.height*0.25*Math.random() ); } } }
randomShape()。这样舞台上就会出现3种不同形状的类型了。 要在Ellipse类的draw()方法中重写父类方法 _shape.graphics.drawEllipse(0, _shape.stage.width*0.25*Math.random(), _shape.stage.height*0.25*Math.random()); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |