• ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题


         面向对象的程序设计(Object-Oriented Programming,简记为OOP)是一种功能非常强大的编程方法,立意于创建软件重用代码,以类为基础去思考编程问题。

         ActionScript 3.0中最本质的东西就是类,在面向对象基础上它重新构建了ActionScript核心。我们在Adobe Flex环境下编写ActionSript 3.0程序,代码都被放在<mx:Script>标签内,所有ActionScript都必须以类的形式出现。

         本文将以ActionScript 3.0中的类为核心,全面讲述关于类的方方面面。

    一、类的基本要素

         在ActionScript 3.0中类是最基本的编程结构,所以必须先掌握编写类的基础知识。关于类有基本必须弄清楚的元素,就是所有的类都必须放在扩展名为.as的文件中,每个as文件里只能定义一个public类,且类名要与.as的文件名相同。这一点和Java是完全相同的。

         另外,在ActionScript 3.0中,所有的类都必须放在包中。用包来对类进行分类管理,相当于文件系统的目录。包的路径相对于类路径(classpath),默认的类路径就是项目的跟目录,既包含mxml文件的所在目录。在Java中同样有包的概念,而在.NET中大家通常称其为名称空间或命名空间。于之不同的是Java/.NET的类可以不属于任何包(名称空间),ActionScript则必须属于包。如下代码块:

     1 /*
     2 * 包:ActionScript.OOP
     3 */
     4 package ActionScript.OOP
     5 {
     6     /*
     7     * 类:属于ActionScript.OOP包
     8     */
     9     public class Book
    10     {
    11         /*
    12          * 构造方法
    13          * /
    14         public function Book()
    15         {
    16             //在开发的路上
    17         }
    18     }
    19 }


         在上一篇文章中已经讲到了在Flex环境下怎么去创建类。这里就不在做重复介绍了,详细请查看《ActionScript 3.0 Step By Step系列(四):来自面向对象开发之前的呐喊:“学会写可重用的代码” 》。

    二、类的属性和方法

         在ActionScript 3.0中既然有类,那类的成员属性和方法肯定是不会缺少的。属性和方法的定义和C#/Java相差不大,也同样有修饰符(本文后续部分介绍)。说简单点类的属性就是和类关联的变量,通过关键字"var"来声明,类的方法则是类的行为(所谓的能做些什么),与C#/Java不同的是ActionScript 3.0中的方法需要使用"function"关键字来声明。

    1     //定义属性(默认为internal)
    2     var name:String = "ActionScript开发手册";
    3     
    4     /*
    5      * 使用function定义方法
    6      */
    7     public function GetBookName():String {
    8         return this.name;
    9     }


         这里需要注意一点,属性的定义默认为internal,另外还有如private,public,protected等修饰符可以进行修饰。如果定义为默认的或是private则外部不能访问类的属性,如果定义为public则不能完好的封装类的成员属性,那怎么办那?在ActionScript 3.0里对类的成员属性也提供了getters和setters,如下代码块:

    1     //定义属性(默认为internal)
    2     var name:String = "ActionScript开发手册";
    3     public function getname():String {
    4         return this.name;
    5     }
    6     
    7     public function setname(name:String):void {
    8         this.name=name;
    9     }


         类的属性访问器上和C#/java也是有所不同的,形式上和Java很相似,但是还所以一点点的差别,在JavaBean里的成员属性的访问器的get后第一个字母要大写,而在实际的开发中发现,这里随便大小写都是可以的,以我个人开发Java的习惯,在ActionScript中定义属性的getters和setters通常就是照Java的方式来编写。如上name属性的getters在Java里应该是public Stirng getName(){......}。


    三、类的派生(继承)

          在.NET/Java这两大平台下,关于OO的各种书籍、文章、杂志等数不胜数。OO的三大特性:封装、继承和多态大家都快说破嘴了。当然ActionScript作为一门面向对象的编程语言,也同样具备这些特性,与类密切相关的就是继承。OK,下面我们来看看在ActinScript 3.0中类的继承是怎么实现的。以动物举例说明,定义父类如下:

     1 package ActionScript.OOP.Inheritance
     2 {
     3     import mx.messaging.channels.StreamingAMFChannel;
     4     
     5     public class Animal
     6     {
     7         public function Animal()
     8         {
     9             this.name = "无名";
    10         }
    11         
    12         public function Animal(name:String)
    13         {
    14             this.name = name;
    15         }
    16         
    17         private var name:String = "";
    18         public function getName():String {
    19             return this.name;
    20         }
    21         public function setName(name:String):void {
    22             this.name = name;
    23         }
    24     }
    25 }


         然后我们需要写Cat和Dog两个类,Cat和Dog都有名字,那么我门就可以直接继承(ActionScript的继承同Java一样,通过关键字extends继承)Animal使用其内部定义的name就OK,这样就减少了写重复代码。在ActionScript 3.0中,子类从他的父类中继承的成员有方法、属性、事件、索引等,这和C#/Java是完全一样的,但对于构造方法,有有一种特殊的继承,就是构造方法只能被调用。ActionScript调用父类的构造方法同Java一样通过super关键字调用,C#则是通过base调用。下面是Cat和Dog基础于父类Animal的代码:

     1 package ActionScript.OOP.Inheritance
     2 {
     3     public class Cat extends Animal
     4     {
     5         public function Cat()
     6         {
     7             super();
     8         }
     9     }
    10 }
    11 
    12 package ActionScript.OOP.Inheritance
    13 {
    14     public class Dog extends Animal
    15     {
    16         public function Dog()
    17         {
    18             super();
    19         }
    20     }
    21 }

    四、方法的覆盖
         方法的覆盖也就是要将从父类继承下来的方法重新实现。这里需要注意的是只有父类方法被声明为public或protected的时候在子类中才能通过override去覆盖。
         比如这样一个应用场景,公司里普通员工和部门经理的工资问题,部门经理的工资是普通员工的3部,员工的其他属性都是相同的,所以我们在定义部门经理类的时候可以直接继承于普通员工,然后去覆盖(重新实现)计算工资的方法便OK。

     1 package ActionScript.OOP.Inheritance
     2 {
     3     public class Employee
     4     {
     5         public function Employee()
     6         {
     7         }
     8         
     9         private var salary:Number = 0.0;
    10         public function getSalary():Number {
    11             return this.salary;
    12         }
    13         public function setSalary(name:salary):void {
    14             this.salary = salary;
    15         }
    16         
    17         public function GetSalary():Number {
    18             return this.salary;
    19         }
    20     }
    21 }


    下面是部门经理类的代码:

     1 package ActionScript.OOP.Inheritance
     2 {
     3     /*
     4      * 部门经理
     5      */
     6     public class Manager extends Employee
     7     {
     8         public function Manager()
     9         {
    10             super();
    11         }
    12         
    13         /*
    14          * 部门经理的工资是普通员工的3部 
    15          */
    16         public override function GetSalary():Number {
    17             return GetSalary() * 3;
    18         }
    19     }
    20 }

        

         方法的覆盖就这么简单,只要父类方法被声明为public或protected在子类中就可以进行重新实现,覆盖父类方法的关键字"override",OK,我已经记住了。

    五、动态类

         与Java一样,在ActionScript 3.0中提供了动态类(dynamic)。动态类定义在运行时可通过添加或更改属性和方法来改变的对象。非动态类(如 String 类)是密封类。您不能在运行时向密封类中添加属性或方法。在声明类时,可以通过使用 dynamic 属性来创建动态类。如果是在Adobe Flex开发环境下创建动态类可以直接在创建类向导里勾选为dynamic,如下图:

                         

         动态类创建好的的程序结构如下代码块:

     1 package ActionScript.OOP.Dynamic
     2 {
     3     /*
     4      * 创建动态类使用dynamic关键字进行声明
     5      */ 
     6     public dynamic class Employee
     7     {
     8         public function Employee()
     9         {
    10         }
    11     }
    12 }


         之所一叫动态类,就是我们可以在运行的时候给他动态的附加成员,比如我们需要为上面的动态类Employee添加一个Name属性,那应该怎么添加呢?如下代码块:

    1     public function TestEmployee():void {
    2         var employee:Employee = new Employee();
    3         employee.Name = "Beniao";
    4         
    5         trace(employee.Name);
    6     }

         

         这里需要注意一点,添加到动态类实例中的属性是运行时实体,因此会在运行时完成所有类型检查。不能向以这种方式添加的属性中添加类型注释。出来可以动态添加属性外,也可以动态添加方法,如下示例代码:

    1      public function TestEmployee():void {
    2           var employee:Employee = new Employee();
    3             
    4           employee.GetName() = function {
    5                //方法体略
    6           }
    7      }


         但是,以这种方式创建的方法对于 Employee类的任何私有属性或方法都不具有访问权限。而且,即使对 Employee类的公共属性或方法的引用也必须用 this 关键字或类名进行限定。

    六、修饰符

          ActionScript 3.0中的常用修饰符主要有internal、private 、public和protected。在定义类或成员属性/方法的时候不加任何修饰符,默认为internal修饰,详细如下:
         (1)private:仅当前类可访问,称为私有成员;
         (2)internal(默认):包内可见,在同一文件夹下可访问(如果不写权限修饰符,默认权限也是它);
         (3)protected:子类可访问,与包无关。如果不是该类的子类,那么 protected 和 private 是一样的;
         (4)public:完全公开。任何地方、任何对象都可以访问这个类的成员。

      另外还有个特殊的修饰符"static",要定义静态类或是静态成员就使用static关键字来修饰,和C#/Java的用法一样。

    七、接口
      接口在面向对象编程中的作用我就不用多说了,可以查考C#/Java类书籍对接口的解释,这里就一笔代过。

    八、推荐文章

      1、速战速决Flash ActionScript 3.0(2) - 包、类、包外类、命名空间、属性、方法、接口和继承
      2、ActionScript 中的面向对象编程

    注:原创文章欢迎转载,本文版权归作者和博客园共有,转载务必注明文章出处。  

         作     者:Beniao

         文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

  • 相关阅读:
    问卷调查--来自20145320周岐浩
    第一次尝试编写java
    写在开始编写Java之前(2)——Java的环境
    写在开始编写Java之前(1)——Java的跨平台性
    一步一步实现JS拖拽插件
    序列图像三维重建 学习流水账
    linux配置虚拟机网络环境(老师要求的host-only)
    递归函数时间复杂度分析(转)
    什么是static?什么是final?
    复习java数据库操作的总结
  • 原文地址:https://www.cnblogs.com/OwenWu/p/1689104.html
Copyright © 2020-2023  润新知