Rya*_*yan 0 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
Run Code Online (Sandbox Code Playgroud)
显然,所有这些都在Visual Basic中.
SharedCallsTable有许多不同版本可以处理SQL数据库中的其他表类型,SharedCallsTable只是一个例子.
问题:
我不能通过使用xsTable构造函数创建SharedCallsTable的实例,该构造函数将单个字符串作为构造函数,因为它调用具有可选参数(maxSecsToDisableConnection)的mdTable构造函数.C#不支持可选参数.
所以当我这样做时:
SharedCallsTable myTable = new SharedCallsTable(connectionString);
Run Code Online (Sandbox Code Playgroud)
我明白了
SharedCallsTable不包含带有'1'参数的构造函数
到目前为止进展
我在C#中创建了另一个类xsToolboxTable,它继承了xsTable并且只调用单个字符串构造函数,如下所示:
class xsToolboxTable : xsTable
{
public xsToolboxTable(string connectionString) : base(connectionString)
{
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这意味着我只能实例化一个xsTable,而不是一个SharedCallsTable的实例,因为它们都是从同一个类继承的.
我也试过让我的扩展类继承自SharedCallsTable,但它给了我同样的东西.
我明白了
SharedCallsTable不包含带有'1'参数的构造函数
我真正需要做的是调用基类构造函数的基础,也就是说,xsTableExtension的基础是SharedCallsTable.SharedCallsTable的基础是xsTable,它有我需要使用的单个字符串构造函数.
我知道这真的很复杂,可能有一个非常简单的解决方案,我只是完全失踪了.
这有点复杂,所以请耐心等待.
是否有某些原因你不能只为可选参数传递值?例如
SharedCallsTable myTable = new SharedCallsTable(connectionString, false, -1);
Run Code Online (Sandbox Code Playgroud)
可选参数实际上只是一个编译器技巧,如果你不提供参数的值,编译器会查看默认值和供应量.因此,通过提供与默认值相同的值,您将观察到与支持可选参数相同的行为并忽略它们.
编辑:
从评论中确定我认为我误解了你的问题.听起来你要求的是能够SharedCallsTable
使用用户提供的连接字符串创建一个实例,绕过它的构造函数逻辑,好像它有一个直接链接到基类构造函数的构造函数.
你不能这样做,而且有充分的理由.构造函数完成工作以使对象处于正确的状态以供使用,并且您不能简单地绕过该逻辑以期望对象工作.
如果您希望能够提供连接字符串,则需要向SharedCallsTable
基类添加一个链到哪个链的构造函数,并确保该类处于合理的状态以供使用.