HarmonyOS学习之ArkTS语法补充学习-类

时间:2024-07-13 14:15:56

如果未定义构造函数,则会自动创建具有空参数列表的默认构造函数。

可见性修饰符:privateprotectedpublic

继承类继承基类的字段和方法,但不继承构造函数。继承类可以新增定义字段和方法,也可以覆盖其基类定义的方法。基类也称为“父类”或“超类”。继承类也称为“派生类”或“子类”。

class Person {
  name: string = ''
  private _age = 0
  get age(): number {
    return this._age;
  }
}

class Employee extends Person {
  salary: number = 0
  calculateTaxes(): number {
    return this.salary * 0.42;
  }
}

/* implements */
interface DateInterface {
  now(): string;
}
// 包含implements子句的类必须实现列出的接口中定义的**所有方法**,但使用默认实现定义的方法除外。
class MyDate implements DateInterface {
  now(): string {
    // 在此实现
    return 'now is now';
  }
}

方法重载签名:通过重载签名,指定方法的不同调用。具体方法为,为同一个方法写入多个同名但签名不同的方法头,方法实现紧随其后。

class C {
  foo(x: number): void;            /* 第一个签名 */
  foo(x: string): void;            /* 第二个签名 */
  foo(x: number | string): void {  /* 实现签名 */
  }
}

let c = new C();
c.foo(123);     // OK,使用第一个签名
c.foo('aa'); // OK,使用第二个签名

/* 构造函数重载签名 */
class C {
  constructor(x: number)             /* 第一个签名 */
  constructor(x: string)             /* 第二个签名 */
  constructor(x: number | string) {  /* 实现签名 */
  }
}
let c1 = new C(123);      // OK,使用第一个签名
let c2 = new C('abc');    // OK,使用第二个签名

对象字面量,可以用来代替new表达式。let c: C = {n: 42, s: 'foo'};

Record<K, V>类型的对象字面量

// 键值对
let map: Record<string, number> = {
  'John': 25,
  'Mary': 21,
}

map['John']; // 25

// 类型K可以是字符串类型或数值类型,而V可以是任何类型。
interface PersonInfo {
  age: number
  salary: number
}
let map: Record<string, PersonInfo> = {
  'John': { age: 25, salary: 10},
  'Mary': { age: 21, salary: 20}
}