09.10.25
类的访问控制:
类本身也有访问控制,有包内访问和公共访问。
包外类:
在package{}之外,只有当前类文件中成员可以访问。
每个.as文件是一个编译单元,其中只有一个对外可见的Class,那么package{}之外的Class就对外不可见了。
① 可将包外类看成当前类文件的“私有类”。
② 对外部完全不可见,可实现单例模式。
包外类的名字如果和同一个包内的类名重复,那么包外类将优先调用。
定义多个类时,如果内部类需要导入其他类,import语句直接在类定义前即可。
例 :
import flash.display.Sprite;
class Foo{}
//Foo类扩展了Sprite类
复合与继承
复合和继承的核心思想是重用现有的代码,一般指重用现有的Class(类)
重用的机制是创立一些新的Class,来利用现有的类。
创建新Class有2中途径:
① 复合:直接在新类中创建现有的Class的对象,成为新类的一部分,这样可以直接使用这些对象所提供的服务。
② 继承:声明一个新类作为现有的类的子类,然后这个新类就自然而然地具有了现有类的功能。
㈠复合
复合的原理是在新创建的类中有一个或者多个对象的引用,而这些对象就是现有类的实例。
现有类一般不是基元数据类型,是复杂数据类型。
在实际编程中,使用复合的频率要远远超过继承。
通过组合的对象互相协作,从而完成单个对象所不能完成的事情,正是复合的巨大优点之一。
被复合类的对外类成员访问控制通常为internal,只对包内可见,复合类的对外接口往往是public,这也是模块思想。
初始化复合的对象
① 定义属性时就初始化复合对象
优点:确保复合对象一定被初始化
缺点:不论复合的对象有没用到,一定会被初始化,浪费资源。
② 在构造函数中初始化
优点:在复合类对象被创建时,被复合的对象才会被创建。
抽离出初始化的语句放入一个方法中(init起头)(private)
③ 在使用对象时在再初始化
优点:节省资源
缺点:当使用到被复合的对象时,才初始化。要多写一些代码确保正确初始化。
if(_mouth==null)
_mouth=new Mouth();
复合与聚合的区别:
△ 新类拥有与原有类相同的对外接口,或许还新增一些接口。
△ 使用原有类对象的地方,可被替换成新类对象。
AS3是一门单继承语言,可通过接口达到类似多继承。
静态成员的继承:
不是private的实例成员都可以被子类继承。类的静态成员不被子类继承。
但是在子类中可以访问父类静态成员。父类的静态成员存在的范围链,包括父类和其所有子类。
若一定要用子类加上静态成员名称来访问。
可以用一种方法来实现子类的静态成员“伪继承”。
即在子类中故意定义同名的静态成员。
例子:
class Extender extends Base{
static const foo:String=Base.foo;
static function hello():void{
Base.hello();
}
}
继承与访问控制
父类中的protected类成员,在子类中可以被访问到,如果没有继承,那么protected作用和private一样。
public和internal的类成员都会被子类继承。
4个访问控制如何选择:
① public:这个类成员需要对外可见,且需要作为类和外部的接口时。
② internal:确保本类不会有子类或者子类在同一个包中。
③ protected:有一个类成员需要被子类访问,而且这个类成员不能对父类和子类的外部可 见,允许子类跨包访问这个类成员。
④ private:当这个类成员只是父类的内部实现机制
根据OOP惯例,使用private应该是最优先的考虑。