AS3面向对象的概念:多态性
多态性是面向对象的概念。一门真正的语言须支持面向对象,它必须提供实现多态对象的开发能力。幸运的是,Actionscript 3满足了这一标准。这篇文章介绍了多态以及如何利用的概念,帮助你建立更强大的应用,促进代码重用,更容易地进行单元测试。
Subtype polymorphism, almost universally called just polymorphism in the context of object-oriented programming, is the ability of one type, A, to appear as and be used like another type, B. from Wikipedia
几乎普遍认为多态性在面向对象编程的上下文中,另外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类的继承链。
****************未完待续******************
来源: http://www.insideria.com/2009/09/as3-object-oriented-concepts-p.html
文章来自: 闪客居(www.flashas.net) 详文参考:http://www.flashas.net/asbc/20091001/4576.html

浙公网安备 33010602011771号