WEB开发网
开发学院图形图像Flash Think in ActionScript 3.0Ⅱ 阅读

Think in ActionScript 3.0Ⅱ

 2009-05-30 12:08:03 来源:WEB开发网   
核心提示: 5.7 对象转型(Casting)一个基类类型变量可以“指向”其子类的对象,一个基类的引用不可以访问其子类对象新增加的成员(属性和方法),Think in ActionScript 3.0Ⅱ(5),可以使用“变量 is 类名”来判断该引用型变

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");
  }
}

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:Think in ActionScript

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接