类与类的继承

TS的类(同ES6)

  class Person {
    name: string
    constructor (name: string) {
      this.name = name
    }
    run(): void {
      alert(`${this.name}在运动`)
    }
    getName(): string {
      return this.name
    }
    setName(name: string): void {
      this.name = name
    }
  }
  let p = new Person('范闲')
  p.run()                               // 范闲在运动
  p.setName('司理理')
  alert(p.getName())                    // 司理理

TS继承

  class Person {
    name: string
    constructor (name: string) {
      this.name = name
    }
    run(): void {
      alert(`${this.name}在运动`)
    }
    getName(): string {
      return this.name
    }
    setName(name: string): void {
      this.name = name
    }
  }
  class Worker extends Person {
    constructor (name: string) {
      super(name)                       // super关键字用于访问父对象上的函数或者属性 super(name)会调用生成一个对象,作为context来调用父类的constructor,然后返回父类的this做为子类的constructor的context继续使用,super改变上下文的this,但是并不会影响父类中的上下文this
    }
  }
  let w = new Worker('林婉儿')
  w.run() // 林婉儿在运动

TS属性修饰符(public, protected, private)

class Person {
  public name: string                  // 外部访问,继承子类访问,类中访问都可以
  protected age: number                // 继承子类访问,类中访问都可以
  private address: string              // 仅可以在类中访问
  constructor (name: string) {
    this.name = name
  }
}

静态方法

class Person {
  name: string
  static age: number = 30              // 静态属性
  constructor (name: string) {
    this.name = name
  }
  run(): void {                        // 实例方法
    alert(this.name)
  }
  static work(): void {                // 静态方法
    alert('工作')                      // 正确执行
    // alert(`${this.name}开始工作`)   // 错误,静态方法只能调用静态属性,非静态属性无法调用
    alert(`我的年龄是${Person.age}`)
  }
}
Person.work()                         // 静态方法调用
let p = new Person('海棠朵朵')
p.run()                               // 实例方法使用
// 静态方法无法调用类里面的非静态属性
alert(Person.age)

多态

多态也是继承,指的是,父类创建一些方法但是不实现,由继承的子类去实现这些方法

class Animal {
  name: string
  constructor (name: string) {
    this.name = name
  }
  eat () {                          // 父类规定一个方法,但是具体实现让继承的子类去实现
    console.log('吃')
  }
}

class Dog extends Animal{
  constructor (name: string) {
    super(name)
  }
  eat () {                          // 多态的表现 狗类实现Eat的独特性
    return `${this.name}吃狗粮`
  }
}

class Cat extends Animal{
  constructor (name: string) {
    super(name)
  }
  eat () {                         // 多态的表现 猫类实现Eat的独特性
    return `${this.name}吃猫粮`
  }
}

抽象方法

一般用作定义类型的标准

抽象方法仅仅只提供其他类实现的基类,不能被实现,abstract定义了抽象类与抽象方法,抽象方法只能出现在抽象类中,且抽象类中必须包含至少一个抽象方法

abstract class Desk {
  abstract leg (): void;
}
abstract class Desk {
  public name: string
  constructor (name: string) {
    this.name = name
  }
  abstract leg (): void;
}

class ComputerDesk extends Desk{
  constructor (name: string) {
    super(name)
  }
  leg (): void {                      // 抽象类的子类必须实现继承的抽象类的抽象方法
    alert(`${this.name}有桌腿`)
  }
}

你可能感兴趣的:(类与类的继承)