ArkTS通过反射调用函数实际应用

概要

使用ArkTS定义接口类,在编写接口实现类时,是无法声明默认实现的,这样无论接口类中的函数是否需要用到,都需要在实现类中进行实现,造成大量的冗余代码,降低代码的可读性。下面我将讲述一下我对此问题的解决思路。

技术细节

1、为了解决上述问题,我想到了将接口类中的函数声明为可空类型,如下所示

export interface LoadCallback {

  onHeightChanged?: (height: number) => void

  closeWindow?: () => void
  
}

2、定义接口实现类,在这里我只实现了closeWindow函数,因为onHeightChanged函数没有用到,所以此处没有实现

private loadCallback?: LoadCallback = {
  closeWindow: (() => {
    router.back();
  }).bind(this)
}

3、通过上面的方式,我们解决了接口实现类冗余代码的问题,下面我们通过this.loadCallback?.closeWindow()的方式进行调用,会发现如下报错“Cannot invoke an object which is possibly 'undefined'. <ArkTSCheck>”。

4、通过直接调用函数的方式行不通,那么就换个思路,通过反射的方式进行调用,反射类的方法如下

export function callMethod(claz: object|undefined, method: string, args?: object|number|string|boolean) {
  if (!claz || !claz[method]) return
  if (args) {
    Reflect.get(claz, method)(args)
  } else {
    Reflect.get(claz, method)()
  }
}

5、使用反射来进行调用

callMethod(this.loadCallback, 'closeWindow')

callMethod(this.loadCallback, 'onHeightChanged', 100)

小结

这样我们就实现了ArkTS通过反射调用函数的实际应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值