在API中有没有对应的函数
搜索上给出的方法是:
include <node_api.h>
// 基类的构造函数
napi_value BaseClassConstructor(napi_env env, napi_callback_info info) {
// ... 基类的构造函数实现 ...
}
// 派生类的构造函数
napi_value DerivedClassConstructor(napi_env env, napi_callback_info info) {
// ... 派生类的构造函数实现 ...
}
// 定义基类的属性、方法等
static napi_property_descriptor base_class_properties[] = {
// ... 基类的属性定义 ...
};
// 定义派生类的属性、方法等
static napi_property_descriptor derived_class_properties[] = {
// ... 派生类的属性定义 ...
};
// 注册基类
napi_value InitBaseClass(napi_env env, napi_value exports) {
napi_property_descriptor* desc = base_class_properties;
size_t desc_count = sizeof(base_class_properties) / sizeof(napi_property_descriptor);
napi_value constructor;
napi_status status;
// 定义基类
status = napi_define_class(env,
NULL,
"BaseClass",
BaseClassConstructor,
NULL,
desc,
desc_count,
&constructor);
if (status != napi_ok) {
napi_throw_error(env, NULL, "Failed to define BaseClass");
return NULL;
}
// 导出基类
napi_set_named_property(env, exports, "BaseClass", constructor);
return exports;
}
// 注册派生类
napi_value InitDerivedClass(napi_env env, napi_value exports) {
napi_property_descriptor* desc = derived_class_properties;
size_t desc_count = sizeof(derived_class_properties) / sizeof(napi_property_descriptor);
napi_value base_class;
napi_value constructor;
napi_status status;
// 获取基类
status = napi_get_named_property(env, exports, "BaseClass", &base_class);
if (status != napi_ok) {
napi_throw_error(env, NULL, "BaseClass not found");
return NULL;
}
// 定义派生类,并指定基类
status = napi_define_class(env,
base_class,
"DerivedClass",
DerivedClassConstructor,
NULL,
desc,
desc_count,
&constructor);
if (status != napi_ok) {
napi_throw_error(env, NULL, "Failed to define DerivedClass");
return NULL;
}
// 导出派生类
napi_set_named_property(env, exports, "DerivedClass", constructor);
return exports;
}
// 模块初始化函数
napi_value Init(napi_env env, napi_value exports) {
// 初始化并导出基类
InitBaseClass(env, exports);
// 初始化并导出派生类
InitDerivedClass(env, exports);
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
描述中派生与基类,都是napi\_property\_descriptor定义的,业务逻辑上不存在派生关系,就是取的名称带有Derived、Base,可以看成是两个完全不同的、存在与ArkTS层对象绑定的不同C++对象的处理方法。
HarmonyOS里,ArkTS层对象与Native C++层对象,就是通过napi\_property\_descriptor、napi\_define\_class、napi\_set\_named\_property、napi\_wrap等等定义和接口来实现这种绑定的。
C++的派生与基类的语法,与标准的C++使用方法一致,使用时遵守标准就行了。