0

セットアップ

私たちのコード ベースのほとんどは VB.NET にあります。VB.NET コードの多くのアセンブリを使用する C# でプロジェクトを開発しています。

VB.NET には関連する 3 つのクラスがあります。

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 はその一例にすぎません。

問題:

オプションのパラメーター (maxSecsToDisableConnection) を持つ mdTable コンストラクターを呼び出すため、単一の文字列をコンストラクターとして受け取る xsTable コンストラクターを使用して SharedCallsTable のインスタンスを作成することはできません。C# は省略可能なパラメーターをサポートしていません。

だから私はこれを行うとき:

SharedCallsTable myTable = new SharedCallsTable(connectionString);

私は得る

SharedCallsTable には、'1' 引数を取るコンストラクターが含まれていません

これまでの進捗

xsTable を継承し、次のように単一の文字列コンストラクターを呼び出すだけの別のクラス xsToolboxTable を C# で作成しました。

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

    }
}

ただし、これは xsTable のみをインスタンス化でき、SharedCallsTable のインスタンスは両方とも同じクラスから継承されるためインスタンス化できないことを意味します。

また、拡張クラスを SharedCallsTable から継承させようとしましたが、同じ結果になります。

私は得る

SharedCallsTable には、'1' 引数を取るコンストラクターが含まれていません

本当に必要なのは、基本クラス コンストラクターのベースを呼び出すことです。つまり、xsTableExtension のベースは SharedCallsTable です。SharedCallsTable のベースは、使用する必要がある単一の文字列コンストラクターを持つ xsTable です。

私はこれが本当に複雑で、私が完全に見逃している本当に単純な解決策があるかもしれないことを知っています.

これはちょっと複雑ですので、ご容赦ください。

4

3 に答える 3

8

オプションのパラメーターに値を渡すことができない理由はありますか? 例えば

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

オプションのパラメーターは、実際には単なるコンパイラーのトリックであり、パラメーターの値を指定しない場合、コンパイラーはデフォルト値が何であるかを調べて提供します。したがって、デフォルトと同じ値を指定すると、オプションのパラメーターがサポートされていてそれらを省略した場合と同じ動作が観察されます。


編集:

コメントからOK私はあなたの質問を誤解したと思います。あなたが求めているのはSharedCallsTable、ユーザーが提供した接続文字列を使用してのインスタンスを作成し、そのコンストラクター ロジックをバイパスして、まるで基本クラスのコンストラクターに直接チェーンされたコンストラクターがあるかのように思えます。

これを行うことはできません。これには正当な理由があります。コンストラクターは、使用する正しい状態のオブジェクトを取得する作業を行います。そのロジックを単純にバイパスして、オブジェクトが機能することを期待することはできません。

接続文字列を提供できるようにする場合は、SharedCallsTableチェーンのコンストラクターを基本クラスに追加し、クラスが適切な状態で使用できるようにする必要があります。

于 2010-01-12T16:16:31.367 に答える
2

いいえ、「基本クラスコンストラクターのベース」を呼び出したくありません-すべての引数を明示的に渡すだけで、基本クラスコンストラクターを通常どおり呼び出したいのです。基本的に、オプションのパラメーターを持たないメソッドとして扱います。これは、他の場所でのコンストラクター呼び出しと連鎖の両方に当てはまります。

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

必要に応じて、次のようにクラスから派生できます。

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

(ただし、いくつかのデフォルトでコンストラクターを呼び出すためだけにクラスから派生しないでください。)

C# 4.0省略可能なパラメーターをサポートしているため、トンネルの終わりに光があることに注意してください。

于 2010-01-12T16:17:44.267 に答える
0

ジョンの提案に従ってこれを行うと

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

以前と同じエラーが発生します

xsTable には、'2' 個の引数を取るコンストラクターが含まれていません

私の解決策 (将来の参照用) は、祖父母クラス mdTable のコンストラクターを、オプションのパラメーターをとらず、接続文字列のみを受け入れるコンストラクターでオーバーライドすることです。

C# 4.0 がリリースされるまでは。

于 2010-01-12T16:41:47.517 に答える