[6] 类

194 阅读3分钟

一、子类继承父类

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方法。

总结:

  1. 类可以没有构造方法,但是子类若有constructor方法,就必须在constructor里调用super()方法,而且必须放第一位置。
  2. 变量必须先定义,再使用,和es6有区别。
  3. new ClassName()一个实例化时,调用的ClassName的constructor()构造函数。
  4. 子类调用父类的构造函数和方法,通过super。
  5. 类继承后,子类可以对父类的方法重新定义,这个过程称之为方法的重写

修饰符

关键字说明举例
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

四、抽象类

  1. 抽象类做为其它派生类的基类使用, 不能直接被实例化。
  2. 抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
  3. abstract关键字是用于定义抽象类和在抽象类内部定义抽象方法

五、抽象类和接口是什么,他们的区别是什么

接口: 接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。接口只是一种形式,接口自身不能做任何事情,不能直接被实例化

使用interface来定义一个接口。

共同点:无法实例化

区别:

1、抽象类当做父类,被继承。接口可以当做“子类”继承其他类,接口要被实现。

2、抽象类中除抽象函数之外,其他函数可以包含具体实现。接口中不能包含具体实现,

3、抽象类中可以有构造器,接口中不可以有

4、抽象方法可当做类的实例方法,添加访问修饰符;但是接口不可以

如何选择:

类与类之间 不允许多继承

接口继承类 不允许多继承

接口与接口间 可以实现多继承

类实现接口 可以多实现

仅供内部使用,未经授权,切勿外传

暂无赞赏,鼓励一下

👏

+1

\