day168-TypeScript基础小记-private与protected

要点

  1. privateprotected类型的比较。
  2. privateprotected修饰符。
  3. protected与类。

类型比较

  1. 比较不同的类型时,如果所有成员类型都是兼容的,就认为类型是兼容的。
  2. 比较privateprotected成员的类型时,只有来自同一处声明时,才认为两个类型是兼容的。

例子1
Employee赋值给Animal时,类型不兼容,因为Employee里也有一个私有成员name,但并不是Animal里面定义的那个。

class Animal {
private name: string
constructor(theName: string) { this.name = theName }
}
class Rhino extends Animal {
constructor() { super('犀牛哥已提前就位') }
}
class Employee {
private name: string
constructor(theName: string) { this.name = theName }
}
let animal = new Animal('羊总')
let rhino = new Rhino()
let employee = new Employee('护林员')
animal = rhino
// 不能将类型“Employee”分配给类型“Animal”。类型具有私有属性“name”的单独声明。ts(2322)
// 注意定义的private name相同
animal = employee

privateprotected修饰符

  1. protected 修饰符与 private 修饰符的行为相似,但有不同,protected 成员在派生类中仍然可以访问。

  2. 例子1

    不能在Person类外使用name,但是可以通过子类Employee类实例方法访问,因为Employee是由Person派生而来。

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
}
public getElevatorPitch () {
return `你好,老弟。我叫 ${this.name} 在附近 ${this.department} 工作`
}
}
let howard = new Employee('小刘', '小卖部')
console.log(howard.getElevatorPitch())
// 属性“name”受保护,只能在类“Person”及其子类中访问。ts(2445)
console.log(howard.name)

protected与类

构造函数也可以被标记成protected。意味着,这个类不能在包含它的类外被实例化,但是能被继承

class Person {
protected name: string
protected constructor(theName: string) { this.name = theName }
}
class Employee extends Person {
private department: string
constructor(name: string, department: string) {
super(name)
this.department = department
}
public getElevatorPitch () {
return `你好,老哥。我叫${this.name},我家搁附近${this.department}。`
}
}
let howard = new Employee('二柱子', '洞拐八拐银行附近')
// 类“Person”的构造函数是受保护的,仅可在类声明中访问。ts(2674)
let john = new Person('铁蛋')

文章作者: lmislm
文章链接: http://lmislm.com/2019/06/30/2019-06-30/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LMISLMのBlog