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

posted @ 2010-05-31 22:00  rob_2010  阅读(319)  评论(0编辑  收藏  举报