AS3中向上转换例子,里氏代换原则

前端之家收集整理的这篇文章主要介绍了AS3中向上转换例子,里氏代换原则前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、多态(Polymorphism),即多种形态。所谓形态,具体是指数据类型(Data Type)。一个对象的数据类型包括自己所属类、自己父


类和所实现的接口类型。从一定角度看,封装和继承几乎是为了实现多态而准备的。比如说,父类和所有的子类是不同的类,但都可


以属于同一个数据种类——父类。也可以有多个类,不继承自同一个父类,但却实现了同一个接口(Interface),那么我们也可以把


这些类看成一个数据种类——实现了同一个接口(Interface)。从而,多态让我们更多地考虑某个数据种类能干什么事,而不用关心


具体的类是什么。




2、要理解多态,首先要理解数据类型和强制转换(Cast)。该类极其父类都被看成同一种数据类型,所有类都属于Object数据类型。


AS3中提供了is和as判断和返回数据类型,先用is判断,若为true再用as告知编译器将该对象理解成as数据类型。


3、向上转换(Upcasting),把一个对象当成它的父类对象来使用。父类被子类继承的方法无非有被重写和不被重写两种。重写


(Override)机制要求被重写的方法与其访问控制、参数类型、返回类型一致;不被重写的方法,则自动默认继承父类的,和父类


样。


4、里氏代换原则(Liskow Substitution Principle,LSP),向上转换是里氏代换原则的必备前提,里氏代换原则是继承复用的基


石。只有子类对象才可以真正替换掉父类对象,软件功能不受影响,使父类达到真正的复用。利用子类不断地在父类基础上增加新的


行为。super()就是父类的构造函数,a。子类需要在构造函数调用父类构造函数;b。在原方法的基础上添加内容


联想其关系:多态、继承、向上转换、super关键字、里氏代换原则




下例中,3个自定义的图形绘制类和一个文档类SampleUpcast,一个是父类KingdaShape,其余圆形类Circle和矩形类Rect都是KingdaShape的子类。

文档类SampleUpcast中,有一个实例方法randomShape(),用来将KingdaShape类型对象在舞台上随机摆放位置。

我们在SampleUpcast的构造函数中,通过运行时随机数,随机生成Circle类和Rect类的对象,并传给randomShape()。

文档类SampleUpcast

  1. package sample.polymorphism
  2. {
  3. /**
  4. * ...
  5. * @author ...
  6. */
  7. import flash.display.Sprite;
  8. import flash.display.Stage;
  9. //由于KingdaShape、Circle、Stage在同一包中,所以不需要导入
  10. public class SampleUpcast extends Sprite
  11. {
  12. public function SampleUpcast()
  13. {
  14. //生成50个形状
  15. for (var i:int = 0; i < 50; i++ ) {
  16. //生成一个随机数Math.random()
  17. //大于0.5,则生成一个Circle对象传给randomShape()
  18. //否则,生成一个Rect对象传给randomShape()
  19. if (Math.random() > 0.5) {
  20. randomShape(new Circle(this));
  21. }else {
  22. randomShape(new Rect(this));
  23. }
  24. }
  25. }
  26. //只接受KingdaShape类的对象,并在舞台上将传入的对象随机摆放
  27. private function randomShape(target:KingdaShape):void {
  28. //生成随机的颜色值
  29. var rand:uint = Math.random() * 0xFFFFFF;
  30. //生成随机的x,y坐标
  31. var posX:Number = stage.stageWidth * Math.random();
  32. var posY:Number = stage.stageHeight * Math.random();
  33. target.fill(rand);
  34. target.move(posX,posY);
  35. }
  36. }
  37.  
  38. }


父类KingdaShape
  1. package sample.polymorphism
  2. {
  3. /**
  4. * ...
  5. * @author ...
  6. */
  7. import flash.display.Shape;
  8. import flash.display.DisplayObjectContainer;
  9. import flash.text.engine.BreakOpportunity;
  10. public class KingdaShape
  11. {
  12. protected var _shape:Shape;//复合了一个Shape类对象_shape(复合:把几个类复合到一个类中。懒汉式初始化(使用时才初始化)。复合是同生共死,聚合是各安天命)
  13. //传入一个MovieClip或者Sprite作为_shape的父容器
  14. public function KingdaShape(parent:DisplayObjectContainer)
  15. {
  16. _shape = new Shape();
  17. parent.addChild(_shape); //加上这一句,屏幕才会显示_shape
  18. }
  19. //绘制
  20. protected function draw() : void {
  21. //放空,供子类重写
  22. }
  23. //填色
  24. public function fill(color:uint):void {
  25. _shape.graphics.beginFill(color,Math.random());//填充颜色
  26. draw();
  27. _shape.graphics.endFill();//结束填充
  28. }
  29. //移动
  30. public function move(x:Number,y:Number):void {
  31. _shape.x = x;
  32. _shape.y = y;
  33. }
  34. }
  35.  
  36. }

圆形类Circle
  1. package sample.polymorphism
  2. {
  3. /**
  4. * ...
  5. * @author ...
  6. */
  7. import flash.display.DisplayObjectContainer;
  8. //自定义的圆形类
  9. public class Circle extends KingdaShape
  10. {
  11. public function Circle(parent:DisplayObjectContainer)
  12. {
  13. super(parent);
  14. }
  15. //重写父类的图形绘制方法
  16. override protected function draw():void {
  17. //画一个随机半径的圆,半径为0到1/5的舞台宽度,_shape在父类中已定义,protected可以直接被子类使用
  18. _shape.graphics.drawCircle(0,_shape.stage.width*0.2*Math.random());
  19. }
  20. }
  21.  
  22. }


矩形Rect类
  1. package sample.polymorphism
  2. {
  3. /**
  4. * ...
  5. * @author ...
  6. */
  7. import flash.display.DisplayObjectContainer;
  8. //自定义的矩形类
  9. public class Rect extends KingdaShape
  10. {
  11. public function Rect(parent:DisplayObjectContainer)
  12. {
  13. super(parent);
  14. }
  15. //重写父类的图形绘制方法
  16. override protected function draw():void {
  17. //绘制一个宽度高度随机的矩形,宽度高度不超过舞台的宽度高度的1/4,_shape在父类中已定义,protected可以直接被子类使用
  18. _shape.graphics.drawRect(0,_shape.stage.width * 0.25 * Math.random(),_shape.stage.height*0.25*Math.random() );
  19. }
  20. }
  21.  
  22. }


当然,也可以自己再编写一个KingdaShape类的子类椭圆形类Ellipse,并改变SampleUpcast构造函数中的逻辑,使得随机数小于0.3时生成Ellipse类的实例传给

randomShape()。这样舞台上就会出现3种不同形状的类型了。

要在Ellipse类的draw()方法中重写父类方法

_shape.graphics.drawEllipse(0,

_shape.stage.width*0.25*Math.random(),

_shape.stage.height*0.25*Math.random());

猜你在找的设计模式相关文章