TypeScript 中的 class

https://www.jb51.net/article/138724.htm

TypeScript 中的 class

讲完了 JavaScript 中的类,还是没有用到 抽象类,抽象方法,私有方法这三个概念,由于 JavaScript 语言的局限性,想要实现这三种概念是很困难的,但是在 TypeScript 可以轻松的实现这一特性。

首先我们稍微修改一下例子中的描述,Person 是抽象类,因为一个正常的人肯定是有国籍的,Person 的 sayHello 方法是抽象方法,因为每个国家打招呼的方式不一样。另外一个人的性别是只能读取,不能修改的,且是确定的是,不是男生就是女生,所以还要借助一下枚举。

?

1

2

3

4

enum Gender {

 female = 0,

 male = 1

};

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

abstract class Person {

 private x: string = '私有属性x,子类和实例都无法访问';

 protected y: string = '私有属性y,子类可以访问,实例无法访问';

 

 name: string;

 public age: number;

 public readonly gender: Gender; // 用关键字 readonly 表明这是一个只读属性

 

 public static x: string = '静态属性x';

 public static foo() {

  console.log(`类 ${this.name} 有一个 ${this.x}`);

 }

 

 constructor(name: string, age: number, gender: Gender) {

  this.name = name;

  this.age = age;

  this.gender = gender;

 }

 

 get fullName(): string {

  const suffix = this.gender === 1 ? '先生' : '女士';

  return this.name + suffix;

 }

 

 set FullName(value: string) {

  console.log(`你已改名为 ${value} `);

 }

 

 // 抽象方法,具体实现交由子类完成

 abstract sayHello(): void;

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

class Chinese extends Person {

 public kungfu: string;

 public static bar() {

  console.log(`类 ${this.name} 的父类是 ${super.name}`);

  super.foo();

 }

 

 public constructor(name: string, age: number, gender: Gender, kungfu: string) {

  super(name, age, gender);

  this.kungfu = kungfu;

 }

 

 public sayHello(): void {

  console.log(`你好我是 ${this.fullName} ,我 ${this.age} 岁了`);

 }

 

 public martial() {

  console.log(`${this.name} 正在修炼 ${this.kungfu} `);

 }

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

class American extends Person {

 static y = '静态属性y';

 public static bar() {

  console.log(`类 ${this.name} 有自己的 ${this.y} ,还继承了父类 ${super.name} 的 ${super.x}`);

 }

 

 public twitter: string;

 

 public constructor(name: string, age: number, gender: Gender, twitter: string) {

  super(name, age, gender);

  this.twitter = twitter;

 }

 

 public sayHello(): void {

  console.log(`Hello, I am ${this.fullName} , I'm ${this.age} years old`);

 }

 

 public sendTwitter(msg: string): void {

  console.log(`${this.name} : `);

  console.log(` ${msg}`);

 }

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Person.x;  // 静态属性x

Person.foo(); // 类 Person 有一个 静态属性x

 

Chinese.x;  // 静态属性x

Chinese.foo(); // 类 Chinese 有一个 静态属性x

Chinese.bar(); // 类 Chinese 的父类是 Person

 

American.x;  // 静态属性x

American.y;  // '静态属性y

American.foo(); // 类 American 有一个 静态属性x

American.bar(); // 类 American 有自己的 静态属性y ,还继承了父类 Person 的 静态属性x

 

const c: Chinese = new Chinese('韩梅梅', 18, Gender.female, '咏春拳');

const a: American = new American('特朗普', 72, Gender.male, 'Donald J. Trump');

 

c.sayHello(); // 你好我是 韩梅梅女士 ,我 18 岁了

c.martial(); // 韩梅梅 正在修炼 咏春拳

a.sayHello(); // Hello, I am 特朗普先生 , I'm 72 years old

a.sendTwitter('推特治国'); // 特朗普 : 推特治国

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章