我有这个基类创建一个新的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也不起作用。
由于 理查德
答案 0 :(得分:9)
您可以为构造函数添加自标识符:
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
答案 1 :(得分:2)
参见相关问题:
基本上我认为你不能在let
内做到这一点,因为它实际上是在一个隐含的lambda的上下文中。