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类的继承链。

 

posted @ 2010-07-30 12:26  光着屁股打天下  阅读(743)  评论(0编辑  收藏  举报