zoukankan      html  css  js  c++  java
  • 继承

    class Animal {
      move(distance: number = 0) {
        console.log(`Animal moved ${distance}m.`)
      }
    }
    
    class Dog extends Animal {
      bark() {
        console.log('Woof! Woof!')
      }
    }
    
    const dog = new Dog()
    dog.bark()
    dog.move(10)
    

    子类重写父类的方法

    派生类包含了一个构造函数,它必须调用super(),它会执行基类的构造函数。

    class Animal {
      name: string
      constructor(name: string) { 
        this.name = name
      }
      move(distance: number = 0) {
        console.log(`${this.name} moved ${distance}m.`)
      }
    }
    
    class Snake extends Animal {
      constructor(name: string) { 
        super(name)
      }
      move(distance: number = 5) {
        console.log('Slithering...')
        super.move(distance)
      }
    }
    
    class Horse extends Animal {
      constructor(name: string) {
        super(name)
      }
      move(distance: number = 45) {
        console.log('Galloping...')
        super.move(distance)
      }
    }
    
    let sam = new Snake('Sammy')
    let tom: Animal = new Horse('Tommy')
    
    sam.move()
    tom.move(34)
    

    Snake类和 Horse 类都创建了 move 方法,它们重写了从 Animal 继承来的 move 方法,使得 move 方法根据不同的类而具有不同的功能。注意,即使 tom 被声明为 Animal 类型,但因为它的值是 Horse,调用 tom.move(34) 时,它会调用 Horse 里重写的方法。

    Slithering...
    Sammy moved 5m.
    Galloping...
    Tommy moved 34m.
    

    公共,私有与受保护的修饰符

    仅当类被实例化的时候才会被初始化的属性

    默认为 public

    class Animal {
      public name: string
      public constructor(name: string) {
        this.name = name
      }
      public move(distance: number) {
        console.log(`${this.name} moved ${distance}m.`)
      }
    }
    

    private

    当成员被标记成 private 时,它就不能在声明它的类的外部访问。

    class Animal {
      private name: string
      constructor(name: string) { 
        this.name = name
      }
    }
    
    new Animal('Cat').name // 错误: 'name' 是私有的.
    

    protected

    protected与private的行为很相似,但有一点不同,protected成员在派生类中仍然可以访问。

    class Person {
      protected name: string
      constructor(name: string) { 
        this.name = name 
      }
    }
    
    class Employee extends Person {
      private department: string
    
      constructor(name: string, department: string) {
        super(name)
        this.department = department
      }
      
      getElevatorPitch() {
        return `Hello, my name is ${this.name} and I work in ${this.department}.`
      }
    }
    
    let howard = new Employee('Howard', 'Sales')
    console.log(howard.getElevatorPitch())  // protected成员在派生类中仍然可以访问。
    console.log(howard.name) // error  不能在声明它的类的外部访问
    

    readonly

    readonly 只读属性必须在声明时或构造函数里被初始化

    class Person {
      readonly name: string
      constructor(name: string) {
        this.name = name
      }
    }
    
    

    静态属性

    属性存在于类本身上面而不是类的实例上。

    class Grid {
      static origin = {x: 0, y: 0}
    
      scale: number
    
      constructor (scale: number) {
        this.scale = scale
      }
    
      calculateDistanceFromOrigin(point: {x: number; y: number}) {
        let xDist = point.x - Grid.origin.x
        let yDist = point.y - Grid.origin.y
        return Math.sqrt(xDist * xDist + yDist * yDist) * this.scale
      }
    }
    
    let grid1 = new Grid(1.0)  // 1x scale
    let grid2 = new Grid(5.0)  // 5x scale
    
    console.log(grid1.calculateDistanceFromOrigin({x: 3, y: 4}))
    console.log(grid2.calculateDistanceFromOrigin({x: 3, y: 4}))
    

    每个实例想要访问这个属性的时候,都要在 origin 前面加上类名。 如同在实例属性上使用 this.xxx 来访问属性一样,这里我们使用 Grid.xxx 来访问静态属性。

    把类当做接口使用

    class Point {
      x: number
      y: number
    }
    
    interface Point3d extends Point {
      z: number
    }
    
    let point3d: Point3d = {x: 1, y: 2, z: 3}
    
  • 相关阅读:
    C#、Java实现按字节截取字符串包含中文汉字和英文字符数字标点符号等
    百度编辑器(UEditor)自定义工具栏
    ASP.NET使用百度编辑器(UEditor)使用方法
    C#设计模式--桥接模式
    C#设计模式--外观模式
    Entity Framework6测试使用
    Entity Framework6的在线下载安装
    C#设计模式--代理模式
    php 回调函数结合闭包(匿名函数)的使用示例
    函数的可变参数实例
  • 原文地址:https://www.cnblogs.com/renzhiwei2017/p/15533104.html
Copyright © 2011-2022 走看看