2012-10-17 99 views
4

我有一個抽象類,有兩個構造函數。當另一個類繼承這個類時,看起來我必須聲明與基類具有相同簽名的構造函數。這對我來說似乎有點多餘。有沒有辦法在我的基類中有Sub New(Parameter as MyClass),並且這已成爲默認的構造函數簽名,除非派生類在其定義中包含它?我可以讓我的派生類自動使用基礎構造函數嗎?

爲了清晰起見,編輯:我希望這意味着我不想在調用基類的派生類中創建構造函數。我希望能夠這樣做:

Mustinherit Class MyBase 

    Sub New(MyParam As String) 

    End Sub 

End Class 

Class MyDerived 
    Inherits MyBase 

End Class 

注意現在派生類不調用基?

+1

剛剛看到您的編輯。你不能那樣做;假設基類有一些從構造函數參數初始化的狀態。在創建派生類對象時,如果不調用基類構造函數,編譯器如何知道如何初始化從基類繼承的狀態?就像@ PhonicUK所說的,如果你的抽象類沒有狀態(沒有字段),那麼作爲一個接口會更好。 –

+0

爲了澄清這個問題:這不是詢問基礎構造函數是否可以避免被調用,而是詢問該調用是否可以是*隱式的* - 不必編寫簡單調用通過基類的代碼。恕我直言,雖然不得不這樣做偶爾是不方便的,但編譯器不會嘗試自動生成此代碼是很好的:如果允許此語法,那麼讀取MyDerived文本的人將不知道構造函數是否存在 - 必須尋找基地。另外,如果第二個構造函數被添加到'MyBase'中,則不能控制'MyDerived'中允許哪個構造函數。 – ToolmakerSteve

+0

...這是一個*代碼編輯便利的例子* - 可以通過添加一個選項來「固定」*智能文本編輯器*(可以對您的解決方案的現有類進行實時分析):當您創建它建議構造函數調用基礎構造函數。 – ToolmakerSteve

回答

-13

在VB.Net你使用:

MyBase.New(args)

你的構造方法的身體裏面,沒有多餘的廢話是在構造函數/方法簽名中使用。

+0

我編輯了我的答案來展示一個例子。看來你的回答證實我不能這樣做,但也許有一種方法可以使用我不熟悉的語法來使它工作。 – oscilatingcretin

+0

更新了我的答案。我懷疑你實際上不希望爲此使用抽象類,而是一個接口。 – PhonicUK

+0

請更新您的答案,以實際回答問題。這應該是VB,而不是C# –

28

你的假設是錯誤的;您的派生類的構造函數可以具有任何簽名,只要他們使用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 
相關問題