多态是OOP编程中的一个重要成员,可以说它对OOP起着很大的作用,也极大的方便了我们的程序设计。那么多态到底是一个什么样的成员呢?多态是什么样子的呢?多态到底在哪里得到应用呢?我们将在本节中进行一系列讨论!
多态的实际含义就是多种形态,也就是说一小段代码可以实现几个不同的功能,这就是多态。那么多态是通过什么手段实现的呢?这里我们就要联系到上一节中的内 容了—“接口”。笔者研究认为多态的最终实现往往是依赖与接口的,而实现多态的另一个组成部分则是—“抽象类”,还有继承。笔者认为熟悉这三个部分对学习 多态是有所帮助的。其实多态的表现就是“向上转换”和“向下转换”。这个转换的过程又和继承息息相关,他们中间的媒介则是接口。这样看起来就非常的简单。 下面我们来看一个实例!
首先我们建立一个抽象类(在FLASH中我们不能真正的建立抽象类,但是我们可以建一个只有空方法的“抽象类”)。
package {
import flash.display.Shape;
import flash.display.DisplayObjectContainer;
public class AshanShape {
protected var _shape:Shape;
public function AshanShape(parent:DisplayObjectContainer){
_shape = new Shape();
parent.addChild(_shape);
}
protected function draw():void{
}
public function fill(color:uint):void{
_shape.graphics.beginFill(color,1);
draw();
_shape.graphics.endFill();
}
public function move(X:Number,Y:Number):void{
_shape.x = X;
_shape.y = Y;
}
}
}
这个抽象类我们建立完成了,下面我们建一个该抽象类的子类,用于实例化使用。
package {
import flash.display.DisplayObjectContainer;
public class Rect extends AshanShape {
public function Rect(parent:DisplayObjectContainer) {
super(parent);
}
override protected function draw():void {
_shape.graphics.drawRect(0,0,100,100);
}
}
}
好了!最后我们建立文档类!
package {
import flash.display.Sprite;
public class Main extends Sprite {
public function Main() {
rand( new Rect(this) );
}
private function rand( target:AshanShape ):void {
target.fill(0x00ff00);
target.move(50,50);
}
}
}
我们来看文档类红色的地方!我们命名写的是Rect类的对象,可为什么下面确实这个抽象类对象呢?实际上这就是“向上转换”。我们归纳成一句话就是“ 把一个对象当成它的父类对象来使用,就成为向上转换 ”。现在大家应该明白什么是向上转换了吧!可有人问了!你这个即没有用到接口,也没有一段代码达到两种不同的功能,这并没有体现出多态啊?确实!这里还没有真正体现出多态的威力。我们将在后面的文章中陆续讲解。毕竟,都写到一篇文章中大家看着类,我写着也累!所以! 本节课先到这里!