抽象类就是供其它类继承的一个基础类。 一般不会直接被实例化。
和接口不同的是,抽象类可以包含成员属性的实现细节。
使用abstract
关键字用于定义抽象类和在抽象类内部定义抽象方法。
这种概念读起来可能有点懵,先举个🌰!
class Animal {
name: string
constructor(name: string) {
this.name = name
}
}
class Dog extends Animal {
}
const dog = new Dog('旺财')
console.log(dog);
const animal = new Animal('贝拉')
console.log(animal)
我们定义了一个类Animal,定义了子类Dog继承于Animal,我们可以现在即可以通过Animal实例化对象,也可以通过Dog实例化对象,但是我们用Dog类就是为了去创建符合dog类的实例化对象,用Animal创建,岂不是多此一举,况且,如果我们再去定义一个Cat也继承于Animal类,那我用Animal类实例化出来的对象,到底是那家的。。。所以,我们想要的不过是,禁止使用Animal实例化对象,只允许Animal类起到一个继承的作用,那么这就是抽象类!
怎么创建一个抽象类?很简单,在class前面加上关键字abstract即可!
需要注意的是:
抽象方法:抽象方法只能定义到抽象类里面,没有具体的实现,即没有函数体,而且必须需要在子类中对此方法进行实现;抽象方法的语法与接口中的方法比较相似, 两者都是定义方法签名不包含方法体, 然而,抽象方法必须使用
abstract
关键字并且可以包含访问符;
下面就是一个抽象类,包含了一个属性name,一个run方法,一个say的抽象方法
abstract class Animal {
name: string;
constructor(name: string) {
this.name = name
}
run(): void {
console.log(`${this.name}每天都晨跑`)
}
// 抽象方法:在父类中的方法前面加上abstract关键字,将方法定义为抽象方法,没有函数体,
abstract say(): void // 抽象方法只能定义到抽象类里面
}
我们来试试,这个时候再使用Animal来实例化一个对象!
const animal = new Animal('贝拉')
可以看到啊,我们的命令行编译已经挂掉了,Cannot create an instance of an abstract class,翻译过来就是:无法创建抽象类的实例
可见这个抽象类是成功的,现在的确无法再使用Animal实例化对象,还是老老实实继承吧
// 定义了抽象方法之后,子类继承父类的时候,如不重新进行方法定义,则会报错
class Dog extends Animal {
say(): string {
return `${this.name}在嗷呜`
}
}
const dog = new Dog('陈贝拉')
dog.run()
console.log(dog.say())
需要注意的是,一旦我们再抽象类中定义了抽象方法,那在继承的子类中,就必须对此抽象方法,进行定义,不然编译也会挂掉!
页面输出:
抽象类完!