我们可以通过extends关键字实现继承,同时父类也可以实例化,但有些父类定义太宽泛了,不够语义化,它定义出来就是为了让子类继承的。所以不允许实例化,可以使用 abstract 关键字
abstract 抽象类
作用:放在 class 前,则该类不允许实例化。 放在 父类的方法 前,则该方法子类必须要重写
// 将 Animal 类 标记为抽象类
abstract class Animal {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
// 将 bark 方法 标记为 抽象方法
//注:抽象方法不可以有具体实现,只能定义结构
abstract bark(): void;
//报错:方法“bark”不能具有实现,因为它标记为抽象。
//abstract bark() {
// console.log("111");
//}
}
class Dog extends Animal {
constructor(name: string, age: number) {
super(name, age);
this.name = name;
this.age = age;
}
//父类定义了back抽象方法,所以此方法必须实现
bark() {
console.log("汪汪");
}
//如果子类不定义 back 方法,则报错
//报错:非抽象类“Dog”不会实现继承自“Animal”类的抽象成员“bark”。
}
const d = new Dog("小狗", 2);
const a = new Animal("动物", 5); //报错:无法创建抽象类的实例。