概要
使用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通过反射调用函数的实际应用。