8

2つのコンストラクターを持つ抽象クラスがあります。別のクラスがこのクラスを継承する場合、基本クラスのものと同じ署名を持つコンストラクターを宣言する必要があるようです。これは私には少し冗長に思えます。基本クラスに含める方法はSub New(Parameter as MyClass)ありますか?派生クラスに定義に含まれていない限り、これをデフォルトのコンストラクターシグネチャにしますか?

わかりやすくするために編集:基本クラスを呼び出す派生クラスにコンストラクターを作成する必要がないことが暗示されていることを期待していました。私はこれを行うことができるようにしたいと思います:

Mustinherit Class MyBase

  Sub New(MyParam As String)

  End Sub

End Class

Class MyDerived
  Inherits MyBase

End Class

派生クラスがベースを呼び出さないことに注意してください。

4

2 に答える 2

34

あなたの仮定は間違っています。派生クラスのコンストラクターは、MyBase.Newを使用して基本クラスのコンストラクターの1つを適切に呼び出す限り、任意のシグニチャーを持つことができます。完全な例を次に示します。

Imports System

Public Class MainClass

    Shared Sub Main()
         Dim w As New Window(5, 10)
         w.DrawWindow(  )

         Dim lb As New ListBox(20, 30, "Hello world")
         lb.DrawWindow(  )

    End Sub
End Class

 Public Class Window
     Public Sub New(ByVal top As Integer, ByVal left As Integer)
         Me.top = top
         Me.left = left
     End Sub 'New

     Public Sub DrawWindow(  )
         Console.WriteLine("Drawing Window at {0}, {1}", top, left)
     End Sub

     Private top As Integer
     Private left As Integer

 End Class

 Public Class ListBox
     Inherits Window

     Public Sub New(ByVal top As Integer, ByVal left As Integer, ByVal theContents As String)
         MyBase.New(top, left) ' 
         mListBoxContents = theContents
     End Sub 

     Public Shadows Sub DrawWindow(  )
         MyBase.DrawWindow(  ) 
         Console.WriteLine("Writing string to the listbox: {0}", mListBoxContents)
     End Sub 

     Private mListBoxContents As String 

 End Class

編集:基本クラスのコンストラクターの署名を保持または拡張する必要はまったくありません。これは有効です。例:

Public Class ListBox
     Inherits Window

     Public Sub New(ByVal theContents As String)
         MyBase.New(20, 30) ' 
         mListBoxContents = theContents
     End Sub 

     'More code

 End Class
于 2012-10-17T12:14:26.567 に答える
-4

VB.Netでは、次を使用します。

MyBase.New(args)

コンストラクターのメソッド本体内では、コンストラクター/メソッドのシグネチャに余分な言い回しは使用されません。

于 2012-10-17T12:13:24.487 に答える