以下のコードでは、コンパイルエラーが発生します
_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ステートメントを継承するシステムの制限かもしれませんが、どこにも文書化されていません。必要な場合は、ドキュメントを参照してください。
表示されている動作は「設計による」です。子クラスは、基本型からコンストラクターを継承しません。子クラスは、独自のコンストラクターを定義する役割を果たします。さらに、定義する各コンストラクターが、暗黙的または明示的に基本クラスコンストラクターを呼び出すか、同じ型の別のコンストラクターにチェーンするようにする必要があります。
すべての子クラスで同じコンストラクターを定義し、MyBase.Newを介して明示的に基本コンストラクターにチェーンバックする必要があります。例
Class ChildClass
Inherits BaseClass
Public Sub New(text As String)
MyBase.New(text)
End Sub
End Class
お探しのドキュメントは、VB言語仕様のセクション9.3.1です。
最も関連性の高いセクションは次のとおりです(2ページ目の大まかな始まり)
型にインスタンスコンストラクター宣言が含まれていない場合、デフォルトのコンストラクターが自動的に提供されます。デフォルトのコンストラクターは、直接ベース型のパラメーターなしのコンストラクターを呼び出すだけです。
これは、子クラスがコンストラクターを継承しないことを明示的に述べているわけではありませんが、ステートメントの副作用です。
パラメーター化されたコンストラクターは、インスタンスメソッドと同じ方法で継承できません。子クラスにコンストラクターを実装し、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