web-dev-qa-db-ja.com

VBのパラメーターでsub new(コンストラクター)を継承できますか?

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

_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ステートメントを継承するシステムの制限かもしれませんが、どこにも文書化されていません。必要な場合は、ドキュメントを参照してください。

41
Bentley Davis

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

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

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

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

最も関連性の高いセクションは次のとおりです(2ページ目の大まかな始まり)

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

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

56
JaredPar

パラメーター化されたコンストラクターは、インスタンスメソッドと同じ方法で継承できません。子クラスにコンストラクターを実装し、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

7
Jose Basilio