抽象类与多态
抽象类
es中并没有引用抽象类的概念,这是ts对es又一次扩展,所谓抽象类就是只能被继承而不能被实例化的类。举例说明:
// 定义抽象类Animal
abstract class Animal {
// 定义方法,子类可以复用
eat() {
console.log('eat')
}
// 也可以不指定方法的具体实现,这就构成了抽象方法
abstract sleep(): void // 好处是,明确知道子类可以有其他的实现,就没必要在父类中实现了
}
// 实例化
// let animal = new Animal() // ❌提示无法创建抽象类的实例,说明它只能被继承
class Dog extends Animal {
constructor(name: string) {
super()
this.name = name
}
name: string
run() {}
sleep() {
console.log('dog sleep')
}
}
let dog = new Dog('wangwang')
dog.eat()
PS:
抽象类的好处是可以抽离出一些事物的共性,有利于代码的复用和扩展。
抽象类也可以实现多态,所谓多态就是在父类中定义一个抽象方法,在多个子类中对这个方法有不同的实现,在程序运行时会根据不同的对象执行不同的操作,这样就实现了运行时的绑定。
多态
紧接上例
class Cat extends Animal {
sleep() {
console.log('Cat sleep')
}
}
let cat = new Cat()
let animals: Animal[] = [dog, cat]
animals.forEach(i => {
i.sleep()
})
特殊的ts类型:this类型
类的成员方法可以直接返回一个this,可以很方便地实现链式调用。
class WorkFlow {
step1() {
return this
}
step2() {
return this
}
}
new WorkFlow().step1().step2()
在继承的时候,this类型也可以表现出多态,这里的多态是指this既可以是父类型也可以是子类型。
class MyFlow extends WorkFlow {
next() {
return this
}
}
new MyFlow().next().step1().next().step2()
PS:
以上调用先返回子类的类型再返回父类的类型然后再返回子类的类型,这样就保持了父类和子类之间接口调用的连贯性。