43

以下のコードでは、コンパイル エラーが発生します。

Error Too many arguments to 'Public Sub New()'

Dim TestChild As ChildClass = New ChildClass("c")TestChild.Method1()どちらも継承元の基本クラスにありますが、受け取りません。

Public Class BaseClass
    Public ReadOnly Text As String
    Public Sub New(ByVal SetText As String)
        Text = SetText
    End Sub
    Public Sub New()
        Text = ""
    End Sub
End Class

Public Class ChildClass
    Inherits BaseClass
End Class

Public Class TestClass
    Sub Test()
        Dim TestChild As ChildClass = New ChildClass("c")
        TestChild.Method1()
    End Sub
End Class

子クラスを次のように変更できます。

Public Class ChildClass
    Inherits BaseClass
      Public Sub New (ByVal SetText As String)
      MyBase.New(SetText)
    End Class
End Class

以下で提案されているように、方法 1 やその他の継承されたメソッドではそれを行う必要はなく、可能な限りクリーンなコードを探しています。これは、パラメーター化された New ステートメントを継承するシステムの制限である可能性がありますが、どこにも文書化されていません。それが必要な場合は、ドキュメントを参照したいと思います。

4

2 に答える 2

59

表示されている動作は「設計による」です。子クラスは、基本型からコンストラクターを継承しません。子クラスは、それ自体のコンストラクターを定義する責任があります。さらに、定義する各コンストラクターが暗黙的または明示的に基本クラスコンストラクターを呼び出すか、同じタイプの別のコンストラクターにチェーンするようにする必要があります。

すべての子クラスで同じコンストラクターを定義し、MyBase.Newを介してベースコンストラクターに明示的にチェーンバックする必要があります。例

Class ChildClass
  Inherits BaseClass
  Public Sub New(text As String)
    MyBase.New(text)
  End Sub
End Class

探しているドキュメントは、VB言語仕様のセクション9.3.1です。

最も関連性の高いセクションは次のとおりだと思います(おおよそ2ページ目の始まり)

タイプにインスタンスコンストラクター宣言が含まれていない場合、デフォルトのコンストラクターが自動的に提供されます。デフォルトのコンストラクターは、直接基本型のパラメーターなしのコンストラクターを呼び出すだけです。

これは、子クラスがコンストラクターを継承しないことを明示的に示していませんが、ステートメントの副作用です。

于 2009-04-26T00:35:18.043 に答える
8

パラメーター化されたコンストラクターは、インスタンス メソッドと同じ方法で継承することはできません。子クラスにコンストラクターを実装してから、MyBase を使用して親のコンストラクターを呼び出す必要があります。

Public Class ChildClass
    Inherits BaseClass

    Public Sub New (ByVal SetText As String)
      MyBase.New(SetText)
    End Class
End Class

Public Class TestClass
  Public TestChild AS New ChildClass("c")
End Class

この制限は、VB 固有のものではありません。私が収集できる限り、C#、Java、C++ のいずれでも、それは絶対に不可能です。

これは、C++ に関する同じ質問を含む関連記事の 1 つです:
c-superclass-constructor-calling-rules

于 2009-04-25T22:45:17.980 に答える