【问题标题】:Inheriting a Visual Basic class in C# and overriding constructors that take optional parameters在 C# 中继承 Visual Basic 类并覆盖采用可选参数的构造函数
【发布时间】:2010-01-12 16:13:08
【问题描述】:

设置

我们的大部分代码库都在 VB.NET 中。我正在用 C# 开发一个项目,它使用了 VB.NET 代码中的大量程序集。

VB.NET 中有三个相关的类:

Public MustInherit Class mdTable
    Public Sub New(ByVal sqlConnectionStr As String, Optional ByVal maxSecsToDisableConnection As Integer = 60)
         ReDim pConnStr(0)
         pConnStr(0) = sqlConnectionStr
         pDBName = parseDBName(sqlConnectionStr)
         m_colLastConnectStatus.disablePeriod = maxSecsToDisableConnection
    End Sub


Public MustInherit Class xsTable //uses the constructor above since second parameter is optional
Inherits mdTable
    Public Sub New(ByVal sqlConnectionString As String)
         MyBase.New(sqlConnectionString)
    End Sub


Public Class SharedCallsTable //the only constructor available in this class
Inherits xsTable
    Public Sub New(Optional ByRef lErrStr As String = "", _
               Optional ByVal checkTableExists As Boolean = False, _
               Optional ByVal sqlServerIndex As Integer = -1)
         MyBase.New(forceServerIndex:=sqlServerIndex)

         defineTable(DBUser, checkTableExists)
         lErrStr &= CStr(IIf(errStr <> "", vbCrLf & errStr, ""))
End Sub

显然,所有这些都在 Visual Basic 中。

SharedCallsTable 有很多不同的版本来处理我们 SQL 数据库中的其他表类型,SharedCallsTable 只是一个例子。

问题:

我无法通过使用将单个字符串作为构造函数的 xsTable 构造函数来创建 SharedCallsTable 的实例,因为它调用了具有可选参数 (maxSecsToDisableConnection) 的 mdTable 构造函数。 C# 不支持可选参数。

所以当我这样做时:

SharedCallsTable myTable = new SharedCallsTable(connectionString);

我明白了

SharedCallsTable 不包含采用“1”参数的构造函数

目前的进展

我在 C# 中创建了另一个类 xsToolboxTable,它继承了 xsTable,并像这样调用单个字符串构造函数:

class xsToolboxTable : xsTable
{
    public xsToolboxTable(string connectionString) : base(connectionString)
    {

    }
}

但是,这意味着我只能实例化一个 xsTable,而不能实例化 SharedCallsTable,因为它们都继承自同一个类。

我也尝试过让我的扩展类继承自 SharedCallsTable,但它给了我同样的结果。

我明白了

SharedCallsTable 不包含采用“1”参数的构造函数

我真正需要做的是调用基类构造函数的base,即xsTableExtension的base是SharedCallsTable。 SharedCallsTable 的基础是 xsTable,它具有我需要使用的单个字符串构造函数。

我知道这真的很复杂,可能有一个非常简单的解决方案,我只是完全想念。

这有点复杂,所以请多多包涵。

【问题讨论】:

    标签: c# vb.net inheritance constructor optional-parameters


    【解决方案1】:

    是否有某些原因您不能只为可选参数传递值?例如

    SharedCallsTable myTable = new SharedCallsTable(connectionString, false, -1);
    

    可选参数实际上只是一个编译器技巧,如果您不提供参数的值,编译器会查看默认值是什么并为您提供。因此,通过提供与默认值相同的值,您将观察到与支持可选参数但您省略它们时相同的行为。


    编辑:

    从评论中可以,我想我误解了你的问题。听起来您要求的是能够使用用户提供的连接字符串创建SharedCallsTable 的实例,绕过其构造函数逻辑,就好像它有一个直接链接到基类构造函数的构造函数。

    你不能这样做,这是有充分理由的。构造函数的工作是让对象处于正确的状态以供使用,您不能简单地绕过该逻辑来期望对象能够工作。

    如果您希望能够提供连接字符串,则需要向SharedCallsTable 添加一个构造函数,该构造函数链接到基类并确保该类处于可以使用的合理状态。

    【讨论】:

    • 因为 SharedCallsTable 中的构造函数旨在与 xsTable 中的另一个构造函数一起使用,该构造函数采用整数(注意对 MyBase.New(forceServerIndex:=sqlServerIndex) 的调用。此调用中引用的 xsTable 构造函数有效使用存储连接字符串的 INI 文件。因此调用实际上是 SharedCallsTable myTable = new SharedCallsTable(lErrString, false, -1); 这不起作用,因为我们将从不支持的网络计算机运行此应用程序有权访问 INI 文件并需要从 app.config 中提取连接字符串。
    • 感谢 Greg,我希望避免在 VB 端添加代码,但看起来我必须这样做。 +1
    【解决方案2】:

    不,您不想调用“基类构造函数的基类”——您想像往常一样调用基类构造函数,只是显式地传入所有参数。基本上,只需将其视为没有任何可选参数的方法。对于其他地方的构造函数调用和链接都是如此:

    SharedCallsTable myTable = new SharedCallsTable(connectionString, false, -1);
    

    如果你愿意,你可以像这样从类派生:

    class xsTableExtension : xsTable
    {
        public xsToolboxTable(string connectionString) : base(connectionString, 60)
        {
        }    
    }
    

    (不要从类派生只是为了调用具有一些默认值的构造函数。)

    请注意,C# 4.0 确实支持可选参数顺便说一句,所以隧道尽头有光。

    【讨论】:

    • 所以我可以通过升级到 Visual Studio 2010 并使用 C# 4.0 来解决这个问题?我以为它还没有。
    • @Ryan:目前处于测试阶段,但可以使用 IME。将于明年3月/4月发布。
    【解决方案3】:

    当我按照 Jon 的建议这样做时

    class xsTableExtension : xsTable
    {
        public xsToolboxTable(string connectionString) : base(connectionString, 60)
        {
        }
    }
    

    我得到了和以前一样的错误

    xsTable 不包含采用“2”个参数的构造函数

    我的解决方案(供将来参考)是覆盖祖父类 mdTable 中的构造函数,使用不带可选参数且仅接受连接字符串的构造函数。

    直到 C# 4.0 出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多