inheritance - 继承类型时获取 "value is not defined"

标签 inheritance f#

我看不出我做错了什么,因为文件的顺序是正确的。在这种情况下是:

  1. BaseDAO.fs
  2. 创建数据库.fs

它们在同一个命名空间中,但即使我将它们放在不同的模块中,并在 CreateDatabase 中打开该模块,也会出现同样的错误。

错误是:

Error   1   The value or constructor 'execNonQuery' is not defined  

我正在尝试继承 BaseDAO 并使用一个对多个文件通用的成员,但我不明白为什么会出现上述错误。

namespace RestaurantServiceDAO

open MySql.Data.MySqlClient

type BaseDAO() =
    let connString = @"Server=localhost;Database=mysql;Uid=root;Pwd=$$$$;"
    let conn = new  MySqlConnection(connString)

    member self.execNonQuery(sqlStr) =
        conn.Open()
        let comm = new MySqlCommand(sqlStr, conn, CommandTimeout = 10)
        comm.ExecuteNonQuery |> ignore
        comm.Dispose |> ignore

继承的类型在这里,execNonQuery没有定义。

namespace RestaurantServiceDAO

open MySql.Data.MySqlClient

type CreateDatabase() =
    inherit BaseDAO()

    let createRestaurantTable conn =
        execNonQuery "CREATE TABLE restaurant(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), cur_timestamp TIMESTAMP(8))"

最佳答案

在 F# 中,继承的成员(以及在当前类型中定义的成员)不能仅通过成员的名称隐式调用 - 您需要以某种方式引用类型的实例。在您的情况下,您可以使用 base 关键字。以下应该有效:

type CreateDatabase() = 
    inherit BaseDAO() 
    let createRestaurantTable conn = 
        base.execNonQuery "..."

[编辑] 这仅在 createRestaurantTable 是一个 member 时有效 - 而不是使用 let 声明的函数(如上例)。原因是 F# 编译器不允许在闭包中使用 caputring base 并将上面的示例解释为闭包。你可以把它变成成员并写:

type CreateDatabase() = 
    inherit BaseDAO() 
    private member x.createRestaurantTable conn = 
        x.execNonQuery "..."

[/EDIT]

或者,您也可以使用 as self 命名该类型的当前实例(类似于使用 member self.Foo() = .. 指定实例)在成员声明中。这也允许您从构造函数调用当前类型的成员:

type CreateDatabase() as self = 
    inherit BaseDAO() 
    let createRestaurantTable conn = 
        self.execNonQuery "..."

如果可能的话,我更喜欢 base 关键字(因为在构造函数中引用当前实例会给编译器带来各种麻烦)。

关于inheritance - 继承类型时获取 "value is not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2799860/

相关文章:

f# - 将 F# 中的 seq 写入输出文件

oauth - AspNet Core 重定向循环中的 Giraffe + GitHub OAuth 流程

迭代数组与列表的性能

更改 Func 参数顺序后,F# 构造函数无法构建

javascript - 在Loopback中实现类表继承

python - 为什么要继承对象类型

excel - 您可以使用 FCell 创建 Excel 插件吗?

c# - 从父类ctor调用重写的方法

C++ 继承 - 从构造函数调用重写

Java-套接字继承