继承与重写:

来源:互联网 发布:北京软件销售招聘 编辑:程序博客网 时间:2024/06/05 20:56

继承与重写:

在子类中经常要改变继承自父类中的某个属性或方法中的内容,但不改变名称。从而达到子类同名方法实现不同功能的多态效果,这种方式叫做重写。

 

只能重写实例方法,不能重写实例属性。

 

重写父类方法必须用新关键字override在前声明。

 

要成功重写实例方法的条件:

①     用override关键字在行首表明重写

②     被重写方法的访问控制,参数数目和参数类型,返回值类型要一致。

 

继承与私有方法的易错误区:

如果在子类中定义和父类的同名private方法a(),而且父类中b()调用a((),那么子类调用b(),b()实际调用的仍是父类的a(),因为父类的private方法和子类是独立的。

 

例子:

       class Base{

              private function hello():void{

                     trace(“Base!”);

              }

              public function test():void{

                     hello();

              }

       }

       class Extender extends Base{

              private function hello():void{

                     trace(“Extender!”);

              }

       }

 

       var foo:Extender=new Extender();

       foo.test();//输出:Base!

 

若要调用Extender的hello方法,须override其test方法。

 

继承与super关键字:

可将super看成一个变量,直接持有对父类的引用,而super()就是父类的构造函数。

 

super不能用在静态方法中.

 

用final终止继承:

将final关键字置于类定义中class关键字前,则声明这个类不能被继承。

final同时可以定义类中的方法不能被子类重写。

 

使用final将某个类或者类成员“固定化”,主要出于2个原因:

①     类的设计

②     代码执行效率

 

何时用复合,何时用继承:

需要用到向上转换时,用继承,向上转型时多态的好处之一。是否需要向上转型,是判断是否采用继承的重要标准之一。

 

△     新类是原有类中一种特殊的分类,需具有原有类的卡一切对外接口,采用继承。

△     新类对象中只包含原有类对象,采用复合。

 

如需向上转型,但采用继承不符合逻辑关系,那么采用实现接口。

 

一般来说,尽量使用复合,少用继承。

 

命名空间:

用来避免命名冲突,区分相同的方法在不同领域的含义,在AS3中,使用namespace可自定义类成员对外部的可见性。

 

类的所有成员声明一直都由2部分组成:

①     命名空间(负责控制类成员对外部的可见性)

②     成员名称

 

使用命名空间3步走:

①     定义命名空间

②     应用命名空间

③     引用命名空间

 

必须用AS3新增的关键字namespace来定义命名空间,namespace前可以有访问控制,控制当前namespace对外可见性。

(与类一样,只有public或者internal)

 

访问控制      namespace    空间名称

 

同一个属性或者方法,只能有一个命名空间修饰。

 

自定义命名空间只有控制类成员的对外可见性,不能控制类的对外可见性。

 

引用命名空间有2中方式:

①     使用use namespace 指令打开命名空间。

②     使用命名限定符“::”直接指定命名空间。

 

使用use namespace指令的:

好处:一次打开,对当前作用域开放

坏处:一旦打开,无法关闭

 

如何定义命名空间:

①     通常会将命名空间定义到一个独立的.as文件

(希望这命名空间能被不同包中的类文件访问到)

②     将命名空间定义到类中

(希望在一个类中使用命名空间切换自己不同版本的方法,属性)

 

如何应用命名空间:

从本质上说,是将这个类成员放入了自定义的命名空间,一旦对某个类成员应用了自定义的命名空间,这个类成员如同private一样,对外不可见了。

 

可同时打开多个命名空间,但如果这些命名空间中有成员名称相同,则会发生冲突,编译报错为“模糊引用”。

 

use namespace指令不受上下文逻辑影响

例子:

       var a:int=3;

       if(a<5){

              use namespace good;

       }

       else{

              use namespace bad;

       }

 

实际效果:

       use namespace good;

       use namespace bad;

       if(a<5){

       }else{}

 

定义在类中也有2中情况:

①     只在类中使用,对类外不可见,可以使用private或者protected定义这个命名空间。

②     需要被外部引用,要么使用public或者internal,要么创建一个外部可调用的方法,用这个方法返回命名空间的引用(前提是类中先use namespace 空间名)

private returnNamespace():Namespace{

              return myNamespace;

}

 

 

类中定义的namespace相当于一种静态成员,属于整个类,而不是单个实例。

 

例子:

package{

       import flash.display.Sprite;

       public class Sample extends Sprite{

              public function Sample(){

                     var foo:Foo=new Foo();

                     trace(Foo.good);

                     var b:Namespace=foo.getName();

                     foo.b::hello();//输出Who are you

              }

       }

}

class Foo{

       public namespace good;

       private namespace bad;

       public function getName():Namespace{

              return Foo.bad;

       }

       bad function hello():void{

              trace(“Who are you”);

       }

}

 

命名空间可以用于:

①     防止命名冲突

②     更灵活的访问控制

③     实现不公开的API


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kongweian/archive/2009/10/28/4740515.aspx

原创粉丝点击