AS3面向对象的概念:多态性(一)
来自:http://bbs.9ria.com/thread-37147-1-1.html
多态性是面向对象的概念。一门真正的语言须支持面向对象,它必须提供实现多态对象的开发能力。幸运的是,Actionscript 3满足了这一标准。这篇文章介绍了多态以及如何利用的概念,帮助你建立更强大的应用,促进代码重用,更容易地进行单元测试。几乎普遍认为多态性在面向对象编程的上下文中,另外A类型能当作另一种类型B使用。
ActionScript 3的多态性,可从两个方向实现。一种方法是使用继承。另一种是通过接口。
继承抽象类
继承是指扩展一个类:
MyClass类继承了SomeClass类所有的公有/受保护的属性和方法。SomeClass在这种情况下被称为MyClass的父类,当一个类以这样扩展时,Actionscript提供了覆盖父类方法的能力,但只有利用了public 或 protected命名空间的属性和方法可以被覆盖。Private私有属性和方法无法从父类扩展,也就是说在MyClass中无法访问/覆盖父类的私有属性和方法。
//Animal.as package { /** * Abstract animal class. */ public class Animal { protected var name:String; public function Animal(name:String) { this.name = name; } public function getName():String { return name; } public function talk():void { //a concrete animal should be able to make some noise. } public function eat():void { //a concrete animal should be able to eat food. } } }
Animal是一个抽象基类,提供基本的功能,在我们的应用程序中所有的动物都会使用。每种动物都有名字,可以说话,可以吃食物。抽象动物不能做任何行为,即它不能说话,没有名字,甚至不能进食维持本身,它只是一种动物的概念,而不是实际的动物。要使这个概念具体化,我们就需要从Animal类扩展创建一个实际的动物。
//Dog.as package { /** * Concrete animal class */ public class Dog extends Animal { public function Dog() { super("Dog"); } override public function eat() : void { trace("nom nom nom dog food"); } override public function talk() : void { trace("woof woof"); } } } //Cat.as package { /** * Concrete animal class */ public class Cat extends Animal { public function Cat() { super("Cat"); } override public function eat() : void { trace("nom nom nom a mouse"); } override public function talk() : void { trace("meow meow"); } } }
上面是从Animal抽象类扩展的Dog和Cat类的两个具体的例子。其实我们做的事情就是在Animal抽象类提供动物行为的概念,具体动物类通过覆盖eat和talk公有方法,使它们的行为正如人们所预期的一样。需要注意的是完全有可能建立一个Animal抽象类的实例,Actionscript同其它语言一样明确的不能提供。无论如何一个抽象类的实例不是很有用,它任何事件都做不了!人们可以利用几点“招数”以防止“直接实例化抽象类”,但这些都在另一篇文章中。
//Polymorphism.as package { import flash.display.Sprite; public class Polymorphism extends Sprite { protected var menagerie:Array = []; public function Polymorphism() { //create som Animal instances var cat:Animal = new Cat(); var dog:Animal = new Dog(); menagerie = [ cat, dog ]; //make the Animal instances perform for each(var animal:Animal in menagerie) { trace(animal.getName() + " is an Animal") animal.eat(); animal.talk(); trace("----"); } } } }
本例中的循环是为了查找Animal类的对象。由于Cat和Dog是从Animal扩展的,它们是Animal对象。因此该方法适用于所有动物。
真实世界的继承
你可以看看Flash平台上所有类的继承关系。所有舞台上的对象都是从DisplayObject继承的,所有事件从Event类扩展。继承创建继承链,其中在链的末端类是该链上所有类的基础。
Canvas -> Container -> UIComponent -> FlexSprite -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object
上面的例子是Flex中 Canvas类的继承链。