开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
抽象类
定义
- 抽象类作为其他派生类的基类使用,他们不会被直接实例化
- 抽象类是专门用于定义哪些不希望外界直接创建的类的
- 抽象类和接口一样用于约束子类
抽象类和接口的区别
- 抽象类必须包含 astract 关键字并且可以包含访问修饰符
- 接口中只能定义约束,不能定义具体实现,而抽象类中既可以定义约束,又可以定义具体实现
export default {}
abstract class Person {
abstract name: string;
abstract show(): string;
showName() {
console.log(this.show())
}
}
class Student extends Person {
name: string = '骚帮';
show(): string {
return `可恶的人${this.name}`;
}
// @2 自定义方法
showName(): void {
console.log('善良的骚帮')
}
}
// @1直接报错
let p = new Person();
let s = new Student();
console.log(s.show())
@1处 证明了 abstract 类不能直接用来创建实例 @2处 可以覆写父类的方法,如果不覆写,就可以直接用父类的方法。
implements 关键字
定义
实现,类可以实现一个或多个接口,使用关键字impolements
注意
实现一个带有可选属性的接口,并不能创建该属性,除非,类里面明确定义了该属性,否则会报错 只要一个接口继承了某个类,那么继承这个类所有的属性和方法,不会继承属性和方法的实现。
与extends的区别
extends 继承某个类,继承之后可以使用父类方法和属性。 implements 实现某个类,必须重写才能使用
export default {}
interface IPersonInfo {
name: string;
age: number;
sex?: string;
show(): void;
}
class Person implements IPersonInfo {
name: string = 'tom';
age: number = 12;
// @1
// sex: string = "男";
show(): void {
console.log(`${this.name}是我们最爱的人,今年${this.age}岁`)
}
}
let p = new Person();
// @2
p.sex = '女'
p.show()
如果@1处注释了 那么后面@2处就报错了,因为这个类根本就没有sex属性,但是如果@1放开,后面就不会报错了。