TypeScript:类的类型变量
class Person { //脱衣服 private disrobe() { //..... } // 穿衣服 private dress() { //..... } //洗操 public takeAbath() { this.disrobe(); console.log("洗澡了"); this.dress(); } //睡觉 public sleep() { this.disrobe(); console.log("睡觉了"); this.dress(); } public eat() { console.log("吃东西了..."); } } class Boy extends Person { static eat() { super.eat(); console.log("别忘记了做好看的吃像...") } static birth() { console.log("生..."); } }
一、类变量指向该类的对象
类也是一种自定义类型,用于指向该类对象, 类变量也可以赋值为null或undefined
let person1:Person = new Person(); person1.eat(); let boy1: Boy = new Boy(); boy1.eat();
二、父类变量指向子类对象
此处只讲语法, 关于类变量指向子类对象的核心思想,见后面多态相关章节
父类变量可以指向子类对象,指向子类的子类的对象也可以, 比如父类是"人(Person)",子类是"男孩(Boy)",因为男孩本就是人,所以可以用人指向它, 只是男孩对象被人指向后,只把男孩当人看待,不当男孩看待. 以当前示例为例,对于let person2: Person = new Boy();而言。 person2只能访问Person类中的成员,不能访问Boy中的成员
let person2: Person = new Boy(); person2.eat();//执行了父类Person中的eat方法 person2.sleep();//执行了父类Person中的sleep方法 // person2.birth();错,因为不能把person2当作Boy看待,所以不能访问Boy中的成员
三、类型断言
当一个父类类型变量指向子类对象时,可以通过”类型断言“ 把该变量强制转换成子类类型变量
let person: Person = new Boy(); let boy = <Boy>person;//类型断言 //let boy = person as Boy; boy.sleep(); boy.eat();
当父类类型变量指向间接子类对象时,该变量可以类型断言成子类的父类类型,断言成什么类,就只能当作该类的对象访问成员了。
如:
A extends B, B extends C, C extends D, D extends F; let obj1: F = new A(); let obj2 = <C> obj1; //obj2可以说部C对象能访问的成员
四、Object变量
Object是一切类的父类,所以可以指向一切对象。
A extends B, B extends C, C extends D, D extends F; let obj1:Object = new A(); let obj2 = <C> obj1; //obj2可以说部C对象能访问的成员