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( '推特治国' ); // 特朗普 : 推特治国 |