4

我有这个基类,它创建一个新的 SQL Server 连接并在 C# 中执行一些实用程序方法,我想在 F# 中继承。目前我无法从 F# 访问 C# 类中的受保护字段,尽管这可以在 C# 中使用。

C#抽象类

public abstract class SQL
{
    protected readonly SqlConnectionStringBuilder bld;
    protected readonly SqlCommand cmd;
    protected readonly SqlConnection conn;
    protected readonly string connstring;
    protected string userid;

    public SQL(string server, string db)
    {
        bld = new SqlConnectionStringBuilder();
        bld.DataSource = server;
        bld.InitialCatalog = db;
        bld.IntegratedSecurity = true;
        connstring = bld.ConnectionString;

        conn = new SqlConnection(connstring);
        cmd = new SqlCommand();

        GetUserID();
        //Other utility methods here
    }

要继承的 F# 代码

type Transfer ( server : string ) ( db : string ) = 
inherit SQL(server, db)  
let accessAbstractConn = conn. //Can't access protected field????

我在这里错过了什么吗?我已经尝试给基类字段加上别名,例如 this.conn 这也不起作用。

谢谢理查德

4

2 回答 2

11

您可以向构造函数添加自标识符:

type Transfer ( server : string, db : string ) as this = 
  inherit SQL(server, db)  
  let accessAbstractConn = this.conn

或者,使用base关键字:

type Transfer ( server : string, db : string ) = 
  inherit SQL(server, db)  
  let accessAbstractConn = base.conn
于 2013-02-26T14:52:38.263 回答
2

查看相关问题:

基本上我认为你不能从 a 中做到这一点,let因为它实际上是在隐式 lambda 的上下文中。

于 2013-02-26T14:27:50.663 回答