day167-TypeScript基础小记-类(2)

要点

  1. 类的例子
  2. 继承
  3. 公共、私有与受保护的修饰符

类的例子

class Greeter {
greeting: string
constructor(message: string) {
this.greeting = message
}
greet () {
return 'hello' + this.greeting
}
}
let greeter = new Greeter('world')
console.log(greeter)

继承-例子1

  • 例子1:

类(Dog)从基类(Animal)中继承了属性和方法。Dog是一个派生类,它派生自Animal`基类`。

通过extends关键字,派生类通常被称作子类基类通常被称作超类

class Animal {
move(distanceInMeters: number = 0) {
console.log(`目标被动物吓退了 ${distanceInMeters}m`)
}
}
class Dog extends Animal {
bark () {
console.log('汪汪汪')
}
}
const dog = new Dog() // 创建一个Dog能够`bark()`和`move()`的实例
dog.bark()
dog.move(10)
dog.bark()

继承-例子2

和例子1有点不同,这个派生类(子类)必须调用super(),它会执行基类(超类)构造函数

且,在构造函数里访问this的属性之前,一定要调用super()(这个是TypeScript强制执行的一条规则)。

例子2,演示了如何在子类里可以重写父类方法。Snake类和Horse类都创建了move方法,它们重写了从Animal继承来的move方法,使得move方法根据不同的类而具有不同的功能。

例子2中tom: Animal,tom被声明为Animal类型,但因为它的值是Horse类型(等于号右边部分),调用tom.move(90)时,它会调用Horse里重写的方法。

class Animal {
name: string
constructor(theName: string) { this.name = theName }
move (distanceInMeters: number = 0) {
console.log(`${this.name} 跑了 ${distanceInMeters}米`)
}
}
class Snake extends Animal {
constructor(name: string) { super(name) }
move(distanceInMeters = 5) {
console.log('蛇出溜滑,遛了遛了..')
super.move(distanceInMeters)
}
}
class Horse extends Animal {
constructor(name: string) { super(name) }
move(distanceInMeters = 45) {
console.log('我老马先跑一步...')
super.move(distanceInMeters)
}
}
let sam = new Snake('哟,这不是子类蛇嘛')
let tom: Animal = new Horse('马哥,马哥,子类马,雷吼')
sam.move()
tom.move(90)

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

public、private

public

class Animal {
public name: string
public constructor(theName: string) { this.name = theName }
public move (distanceInMeters: number) {
console.log(`${this.name} 移动 ${distanceInMeters}米。`)
}
}

private

class Animal {
private name: string
constructor(theName: string) { this.name = theName }
}
// 属性“name”为私有属性,只能在类“Animal”中访问。ts(2341)
new Animal('Cat').name
文章作者: lmislm
文章链接: http://lmislm.com/2019/06/29/2019-06-29/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMISLMのBlog