2010-01-12 3 views
0

установки параметровНаследование Visual Basic класса в C# и первостепенных конструкторов, которые принимают дополнительные параметры

Большая часть нашего кода база находится в 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 - всего лишь один пример.

Проблема:

Я не могу создать экземпляр SharedCallsTable с помощью конструктора xsTable, который принимает одну строку, как конструктор, так как он вызывает конструктор mdTable, который имеет дополнительный параметр (maxSecsToDisableConnection). C# не поддерживает дополнительные параметры.

Так что, когда я делаю это:

SharedCallsTable myTable = new SharedCallsTable(connectionString); 

я

SharedCallsTable не содержит конструктор, который принимает аргументы '1'

Прогресс до сих пор

У меня есть cr eated другого класса, xsToolboxTable, в C#, который наследуется xsTable и просто называют единственную строку конструктора, как так:

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

    } 
} 

Однако, это означает, что я могу только создать экземпляр xsTable, но не экземпляр SharedCallsTable, так как они оба наследуют от тот же класс.

Я также попытался сделать мой класс расширения наследованием от SharedCallsTable, но тогда он дает мне то же самое.

я

SharedCallsTable не содержит конструктор, который принимает аргументы «1»

Что мне действительно нужно сделать, это позвонить в базу конструктора базового класса, то есть, Основой xsTableExtension является SharedCallsTable. Основой SharedCallsTable является xsTable, у которого есть единственный конструктор строк, который мне нужно использовать.

Я знаю, что это действительно запутанно, и может быть очень простое решение, которое я просто полностью отсутствует.

Это довольно сложно, поэтому, пожалуйста, несите меня.

ответ

8

Есть ли причина, по которой вы не можете просто передать значения для необязательных параметров? например

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

Дополнительные параметры действительно только компилятор трюк в котором, если вы не предоставите значение для параметра компилятор имеет вид, что значение по умолчанию является и расходных материалов для вас. Поэтому, задавая значения, которые совпадают с значениями по умолчанию, вы будете наблюдать такое же поведение, как если бы были добавлены дополнительные параметры, и вы их исключили.


Edit:

ОК от комментария я думаю, что я неправильно понял ваш вопрос. Похоже, то, о чем вы просите, это создать экземпляр SharedCallsTable с предоставленной пользователем строкой подключения, минуя логику конструктора, как если бы у него был конструктор, связанный непосредственно с конструктором базового класса.

Вы не можете этого сделать и по уважительной причине. Конструкторы выполняют работу, чтобы получить объект в правильном состоянии для использования, и вы не можете просто обойти эту логику, ожидая, что объект будет работать.

Если вы хотите предоставить строку соединения, вам нужно добавить конструктор в SharedCallsTable, который связывается с базовым классом и гарантирует, что класс находится в разумном состоянии для использования.

+0

+1. Разумный подход. – RichardOD

+0

, потому что конструктор в SharedCallsTable предназначен для работы с другим конструктором в xsTable, который принимает целое число (обратите внимание на вызов MyBase.New (forceServerIndex: = sqlServerIndex). Конструктор xsTable, на который ссылается этот вызов, работает с INI-файлом, который хранит строка подключения. Таким образом, на самом деле вызов будет SharedCallsTable myTable = new SharedCallsTable (lErrString, false, -1); Это не сработает, потому что мы будем запускать это приложение с сетевого компьютера, у которого нет доступа к INI-файлу, и ему нужно вывести строки подключения из app.config. – Ryan

+0

Thanks Greg, Я надеялся избежать добавления кода на сторону VB, но похоже, что это то, что мне нужно сделать. +1 – Ryan

2

Нет, вы не хотите, чтобы вы называли «базой конструктора базового класса» - вы хотите, чтобы он вызывал конструктор базового класса как обычно, просто явно передавая все аргументы. Просто рассматривайте его как метод, который не имеет каких-либо дополнительных параметров, в основном. Это верно и для вызова конструктора в другом месте и цепочки:

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

, и вы можете получить из класса, как это, если вы хотите:

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

(Не наследоваться от класса просто для вызова конструктора с некоторыми значениями по умолчанию.)

Обратите внимание, что C# 4.0 поддерживает дополнительные параметры btw, поэтому в конце туннеля есть свет.

+0

+1 для указания дополнительных параметров в C# 4.0. – RichardOD

+0

Так что я мог бы решить это, обновив визуальную студию 2010 и используя C# 4.0? Я думал, что он еще не доступен. – Ryan

+0

@ Ryan: В настоящий момент это бета-версия, но полезная IME. Он будет выпущен в марте/апреле следующего года. –

0

Когда я делаю это, как предложил Джон

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

я получаю ту же ошибку, как и раньше

xsTable не содержит конструктор, который принимает аргументы '2'

Мое решение (для дальнейшего использования) - переопределяет конструктор в классе grandparent mdTable с тем, который делает es не принимает необязательный параметр и просто принимает строку подключения.

До тех пор, пока C# 4.0 не будет.

Смежные вопросы