HarmonyOS鸿蒙Next中巧用accessor给class(类)增加访问器

HarmonyOS鸿蒙Next中巧用accessor给class(类)增加访问器 在类继承的场景下,父类也要写get和set,是否有方法简化?

class BaseTemperature {
  // 私有变量
  private _value: number = 20; // 默认室温

  // getter
  get value(): number {
    return this._value;
  }

  // setter
  set value(newValue: number) {
    this._value = newValue;
  }
}

class Temperature extends BaseTemperature {
  private _minTemp: number = -273.15; // 绝对零度
  private _maxTemp: number = 100; // 水的沸点

  get value(): number {
    return super.value;
  }

  set value(temp: number) {
    const clampedTemp = Math.max(this._minTemp, Math.min(this._maxTemp, temp));
    super.value = clampedTemp;
  }
}

更多关于HarmonyOS鸿蒙Next中巧用accessor给class(类)增加访问器的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

用accessor修饰父类的value就好了:

class BaseTemperature {
  accessor value: number = 20; // 默认室温
}

完整代码:

class BaseTemperature {
  accessor value: number = 20; // 默认室温
}

class Temperature extends BaseTemperature {
  private _minTemp: number = -273.15; // 绝对零度
  private _maxTemp: number = 100; // 水的沸点

  get value(): number {
    return super.value;
  }

  set value(temp: number) {
    const clampedTemp = Math.max(this._minTemp, Math.min(this._maxTemp, temp));
    super.value = clampedTemp;
  }

  // 格式化显示温度
  format(): string {
    return `${this.value.toFixed(2)}°C`;
  }
}

// 使用示例
const temp = new Temperature();

temp.value = -300; // 会自动变为 -273.15(限制在最小值)
console.log(`当前温度:${temp.format()}`);

DevEco Studio输出:

cke_13661.png

更多关于HarmonyOS鸿蒙Next中巧用accessor给class(类)增加访问器的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用accessor为class添加访问器可通过装饰器实现。例如,使用@Observed装饰类,结合@ObjectLink@Prop装饰属性访问器,支持数据变化监听。访问器包括getter和setter,用于封装属性访问逻辑,确保数据响应式更新。示例代码中,通过@Observed类定义属性,并在组件中使用访问器实现状态管理。

在HarmonyOS Next的ArkTS中,可以通过accessor关键字和@Consume@Provide装饰器来简化继承场景下的属性访问器管理,避免在父类中重复编写基础的getter/setter。

对于你提供的温度控制类场景,可以这样优化:

1. 使用 accessor 简化属性声明 accessor 会自动生成一个私有备份字段和对应的getter/setter,无需手动编写。

class BaseTemperature {
  // 使用accessor自动生成_value和get/set方法
  accessor value: number = 20;
}

2. 子类中重写访问器 子类可以直接重写父类的accessor,添加额外的逻辑:

class Temperature extends BaseTemperature {
  private _minTemp: number = -273.15;
  private _maxTemp: number = 100;

  // 重写父类的accessor
  override get value(): number {
    return super.value;
  }

  override set value(temp: number) {
    const clampedTemp = Math.max(this._minTemp, Math.min(this._maxTemp, temp));
    super.value = clampedTemp;
  }
}

3. 状态管理场景的进一步简化 如果涉及组件状态管理,可以使用装饰器:

@Provide
class TemperatureService {
  accessor currentTemp: number = 20;
}

@Component
struct ChildComponent {
  @Consume tempService: TemperatureService;
  
  build() {
    // 直接访问tempService.currentTemp
    Text(`温度: ${this.tempService.currentTemp}`)
  }
}

关键优势:

  • accessor 自动创建私有存储字段,减少样板代码
  • 子类可通过override明确重写访问器逻辑
  • 与状态管理装饰器(@Provide/@Consume)无缝配合
  • 保持类型安全的同时简化继承结构

这样父类只需用accessor声明属性,子类按需重写,代码更简洁清晰。

回到顶部