f# - 寓言:如何覆盖从 JavaScript 外部库导入的 JS 类方法?(打字)
问题描述
扩展从 Javacript 库导入的类同时能够调用父级成员的预期方法是什么?
我尝试了几种替代方法,使用抽象类显然可以正常工作,但孩子无法调用父类的抽象方法,接口也没有错误,但我无法调用父类,因为没有参考。
我找到的最好的方法是以下一种覆盖 mezhods 的方法,尽管 yielt 代码有效,但编译器仍然会发出错误:
错误 FSHARP:未找到与此覆盖相对应的抽象或接口成员(代码 855)
我当前的代码:
[<Import("DataManager", from="library/data")>]
type DataManager<'Model> (conf:obj) =
class
member this.insert(_:'Model):Promise<obj> = jsNative
member this.update (_:'Model):Promise<obj> = jsNative
end
type MyAdaptor<'Model> (conf, inst)=
inherit DataManager<'Model> (conf)
let DB:obj = inst
do
printf "I've been created"
override this.insert(o:'Model):Promise<obj> =
printf "insert method comes with object:"
console.log o
base.insert o
//Constructors.Promise.Create o
override this.update(o:'Model): Promise<obj> =
printf "Update method comes with object:"
console.log o
base.update o
//Constructors.Promise.Create o
以前我也尝试只使用成员并且仍然调用基的方法,但是虽然它编译没有问题,但调用实例的方法时只执行父的代码。恐怕这可能是一个错误。
我也有几次尝试在自制的构造函数中手动调用继承,但它通常无法编译,因为导入的 JS 要么未被识别为有效的构造函数,要么我无法包含方法定义(我关心类型安全) .
解决方案
事实证明,在 F# 中,人们无法覆盖之前未声明为抽象的方法。
为此,解决方案是将方法声明为抽象方法并在覆盖之前提供默认实现。
[<Import("DataManager", from="library/data")>]
type DataManager<'Model> (conf:obj) =
class
abstract member insert: 'Model -> Promise<obj>
default this.insert(_:'Model):Promise<obj> = jsNative
abstract member update:'Model -> Promise<obj>
default this.update (_:'Model):Promise<obj> = jsNative
end
之后,可以毫无问题地覆盖子类。
推荐阅读
- javascript - 将 NuxtJS 用于 Zoho CRM 小部件
- java - MIUI无声推送通知
- linux - Vulkan 验证层无法在 Linux 上加载/工作
- json - JSON to Google sheet --> Strange Columns + 一个单元格中的所有内容
- python - 当 lxml etree.ElementTree 是字符串时,为什么 XML 仅针对 XSD 进行验证?
- apache-camel - 对骆驼聚合拆分的最后一个索引执行操作
- php - ::class 方法的使用
- javascript - 为什么我收到错误“firebase.database 不是函数”?
- python - 从不同的字典和键/值集创建多级字典 - python
- python-3.x - 不使用 split() 方法重新排列 String(sentence) 的位置