首页 > 解决方案 > 寓言:如何覆盖从 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#fable-f#

解决方案


事实证明,在 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

之后,可以毫无问题地覆盖子类。


推荐阅读