Think in ActionScript 3.0Ⅱ
2009-05-30 12:08:03 来源:WEB开发网5.7 对象转型(Casting)
一个基类类型变量可以“指向”其子类的对象。
一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。
可以使用“变量 is 类名”来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。
子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)。
每说到转型,就不得不提到“里氏代换原则(LSP)”。里氏代换原则说,任何基类可以出现的地方,子类一定可以出现。里氏代换原则是对“开放—关闭”原则的补充。
里氏代换原则准确的描述:在一个程序中,将所有类型为 A 的对象都转型为 B 的对象,而程序的行为没有变化,那么类型 B 是类型 A 的子类型。
比如,假设有两个类:Base 和 Extender,其中 Extender 是 Base 的子类。如果一个方法可以接受基类对象 b 的话: method(b:Base) 那么它必然可以接受一个子类对象 e,即有 method(e)。注意,里氏代换原则反过来不能成立。使用子类对象的地方,不一定能替换成父类对象。
向上转型是安全的,可以放心去做。但是在做向下转型,并且对象的具体类型不明确时通常需要用 instanceof 判断类型。下面看一个例子 TestPolymoph.as:
package {
public class TestCast {
public function TestCast() {
// -------------- UpCasting --------------
var cat:Cat = new Cat();
var dog:Dog = new Dog();
var animal:Animal = Animal(cat);
animal.call();
animal.sleep();
//animal.eat(); // 不能调用父类中没有定义的方法
// ------------- DownCasting -------------
if (animal is Cat) {
cat = Cat(animal);
cat.eat();
} else if (animal is Dog) {
dog = Dog(animal);
dog.eat();
}
}
}
}
class Animal {
public function call():void{};
public function sleep():void{};
}
class Cat extends Animal {
override public function call():void {
trace("Cat Call");
}
override public function sleep():void {
trace("Cat Sleep");
}
public function eat():void {
trace("Cat Eat");
}
}
class Dog extends Animal {
override public function call():void {
trace("Dog Call");
}
override public function sleep():void {
trace("Dog Sleep");
}
public function eat():void {
trace("Dog Eat");
}
}
Tags:Think in ActionScript
编辑录入:爽爽 [复制链接] [打 印]- ››include指令与<jsp:include>动作的区别
- ››Intent和IntentFilter详解
- ››thinkphp上传错误解决方法
- ››ActionScript 2.0中的! 逻辑 NOT 运算符
- ››Interface继承至System.Object?
- ››input按钮在IE浏览器的兼容
- ››ActionScript 3.0 性能方面优化小知识整理收集
- ››Intent调用大全
- ››IntentService实现原理及内部代码
- ››Internet Explorer 无法打开
- ››Intel和Nokia宣称MeeGo将比Android更加开放且方便...
- ››innerText、outerText、innerHTML、outerHTML的区...
更多精彩
赞助商链接