在C#中继承Visual Basic类并重写带有可选参数的构造函数

时间:2010-01-12 16:13:08

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

设置

我们的大部分代码都是在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中。

在我们的SQL数据库中有许多不同版本的SharedCallsTable处理其他表类型,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'参数的构造函数

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

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

这有点复杂,所以请耐心等待。

3 个答案:

答案 0 :(得分:8)

是否有某些原因你不能只传递可选参数的值? e.g。

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

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


修改

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

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

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

答案 1 :(得分:2)

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

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

如果您愿意,可以从类中派生出来:

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

(不要仅仅为了使用某些默认值调用构造函数而从类派生。)

请注意,C#4.0 支持支持可选参数btw,因此隧道尽头有光。

答案 2 :(得分:0)

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

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

我得到了与之前相同的错误

  

xsTable不包含带有'2'参数的构造函数

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

直到C#4.0出局为止。