8

我有一个有两个构造函数的抽象类。当另一个类继承这个类时,似乎我必须声明与基类中具有相同签名的构造函数。这对我来说似乎有点多余。有没有办法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 正确调用其基类的构造函数之一。这是一个完整的例子:

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 回答