继承与重写:
来源:互联网 发布:北京软件销售招聘 编辑:程序博客网 时间: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
- 继承与重写:
- JS 继承与重写
- 关于继承与重写
- 继承与重写
- C#: 继承,重写与隐藏
- 13.Swift-继承与重写
- js中的继承与重写
- Swift 中的继承 与 重写
- 重载与重写,继承与多态
- C#中的继承、隐藏与重写
- php的类的继承与重写
- 继承概念与方法的重写小结
- javascript类的继承与方法重写
- 继承概念与方法的重写小结
- Java中的继承,重写与遮蔽
- java中父类子类的继承与函数重写
- java 子类继承父类 -- 重写、覆盖与多态
- 继承、多态,重载、重写的区别与总结
- bjrcb-日志汇总(五)
- AS3:加载swf,直接根据类名获取影片剪辑
- SQL语句删除表中所有数据
- c/c++中获取当前目录
- 从Android手电筒程序中学到的知识
- 继承与重写:
- FSO 操作大全
- POJ 1971 Parallelogram Counting(枚举+HASH)
- SHELLEXECUTEINFO 和 ShellExecuteEx的使用
- POJ 1050 To the max 最大子矩阵
- ARM与嵌入式linux入门的建议
- 实用的 jquery 弹出窗口 插件winbox
- Linux 计算线程CPU占用率
- java小技巧