一、子类继承父类
ES6 的class依然有一些特性还没有加入,比如修饰符和抽象类。
TypeScript 的 class 支持面向对象的所有特性,比如 类、接口等。
// 父类,放公共的属性和方法
class Animal {
// 字段
name: string
// 构造函数
constructor(name: string) {
this.name = name
}
// 方法
move(distance: number = 0) {
console.log(`${this.name} moved ${distance}m.`)
}
}
// 子类,去继承父类
class Dog extends Animal {
live: number // 子类的属性
constructor(name: string, live: number) {
super(name) // super去调用父类的构造方法
this.live = live
}
// 重写了move方法。
move(distance: number = 5) {
console.log('Slithering...')
super.move(distance) // 调用父类的方法
}
}
// 使用
let dog = new Dog('dog', 23); // 通过子类去实例化的
dog.move(4); // 调用子类的方法,子类的move里才去调用父的move方法。
总结:
- 类可以没有构造方法,但是子类若有constructor方法,就必须在constructor里调用super()方法,而且必须放第一位置。
- 变量必须先定义,再使用,和es6有区别。
- new ClassName()一个实例化时,调用的ClassName的constructor()构造函数。
- 子类调用父类的构造函数和方法,通过super。
- 类继承后,子类可以对父类的方法重新定义,这个过程称之为方法的重写
修饰符
| 关键字 | 说明 | 举例 |
|---|---|---|
| public(公共的,默认) | 任何地方,例如在外面的实例,a.name,a.sayHello(); | |
| private(私有的) | 只能在类的里面使用,不能出类。 | private _fullName: string |
| protected(公共的) | 自己类里面及其子类里面使用,不能出类。子类的实力话对象也是不能访问的。 | |
| readonly | 只读不能写 |
其他作用:作为参数属性
参数属性可以方便地让我们在一个地方定义并初始化一个成员。
不过不建议使用,在类里面声明好属性,一目了然。
class Person {
constructor(readonly name: string) { // 就不需要写 定义了readonly name: string
}
}
三、静态属性
static,挂在类上的,通过类名去访问。
class Square {
static width = '100px'
}
console.log(Square.width) // 100px
四、抽象类
- 抽象类做为其它派生类的基类使用, 不能直接被实例化。
- 抽象类中的抽象方法不包含具体实现并且必须在派生类中实现。
abstract关键字是用于定义抽象类和在抽象类内部定义抽象方法
五、抽象类和接口是什么,他们的区别是什么
接口: 接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。接口只是一种形式,接口自身不能做任何事情,不能直接被实例化
使用interface来定义一个接口。
共同点:无法实例化
区别:
1、抽象类当做父类,被继承。接口可以当做“子类”继承其他类,接口要被实现。
2、抽象类中除抽象函数之外,其他函数可以包含具体实现。接口中不能包含具体实现,
3、抽象类中可以有构造器,接口中不可以有
4、抽象方法可当做类的实例方法,添加访问修饰符;但是接口不可以
如何选择:
类与类之间 不允许多继承
接口继承类 不允许多继承
接口与接口间 可以实现多继承
类实现接口 可以多实现
仅供内部使用,未经授权,切勿外传
暂无赞赏,鼓励一下
👏
+1
\