抽象类
以abstract修饰的类是抽象类,和其他类区别不大,只是不能用来创建实例对象,抽象类的作用是用来被继承的类。
//抽象类Animal
abstract class Animal {
name:string;
age:number;
constructor(name:string,age:number){
this.name=name;
this.age=age;
}
sayHellow(){
console.log('动物在叫~');
}
}
const animal=new Animal()
抽象成员
抽象类中可以添加抽象方法和抽象属性,也是用abstract来修饰。定义的抽象成员表示需要子类实现。如果子类没有实现抽象成员就会报错。定义的抽象方法没有方法体不需要实现功能,子类需要对抽象方法进行重写实现方法体功能。抽象方法只能定义在抽象类中。
abstract class A {
abstract foo:string;
bar:string = '';
abstract sayHi():void;
}
class B extends A {
}
上面示例中,抽象类A定义了抽象属性foo和抽象方法sayHi,子类B必须实现这个属性和方法,否则会报错。
abstract class Animal {
name:string;
age:number;
abstract foo:string;
constructor(name:string,age:number){
this.name=name;
this.age=age;
}
abstract sayHi():void;
}
class Cat extends Animal{
// 子类实现抽象属性
foo = 'b';
// 子类必须给出抽象方法的实现
sayHi(): void {
console.log('喵喵喵~~~');
}
}
const cat =new Cat('maomao',3);
console.log(cat);
cat.sayHi();
抽象方法:父类定义一个方法不去实现,让继承的子类去实现,每一个子类有不同的表现形式。
注意点:
(1)抽象成员只能存在于抽象类,不能存在于普通类。
(2)抽象成员不能有具体实现的代码。也就是说,已经实现好的成员前面不能加abstract关键字。
(3)抽象成员前也不能有private修饰符,否则无法在子类中实现该成员。
(4)一个子类最多只能继承一个抽象类。
抽象类的作用是确保各种相关的子类都拥有跟基类相同的接口,可以看作是模板。其中的抽象成员都是必须由子类实现的成员,非抽象成员则表示基类已经实现的、由所有子类共享的成员。
类的类型
给类加上 TypeScript 的类型很简单,与接口类似:变量的类型定义可以定义为一个类。
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
sayHi(): string {
return `My name is ${this.name}`;
}
}
let a: Animal = new Animal('Jack');
console.log(a.sayHi()); // My name is Jack