2010-02-15 59 views
2

我有一個抽象類,它需要一個委託功能。我將委託傳遞給構造函數。現在我有一個非默認構造函數,我需要從具體類調用抽象類的構造函數,這意味着我需要使用MyBase.New(...)。我在下面包含了一個快速示例。我可以將一個委託從一個後代的構造函數傳遞給一個抽象類的構造函數嗎?

Public MustInherit Class BaseClass 
    Public Delegate Sub WorkMethod() 
    Private _Work As WorkMethod 

    Public Sub New(ByVal Work As WorkMethod) 
     Me._Work = WorkMethod 
    End Sub 
End Class 

Public Class ConcreteClass 
    Public Sub New() 
     MyBase.New(AddressOf DoSomethingHere) 
    End Sub 

    Public Sub DoSomethingHere() 
     'Do some work here 
    End Sub 
End Class 

我試圖這樣做,但我不斷收到以下錯誤:「隱式引用在建對象調用另一個構造函數時是無效的」。

我不能做我上面想做的事嗎?我最初使用自己的setter方法進行代理設置。但後來我創建了一個欺騙性的API,因爲它確實需要一個方法才能正常工作。

回答

3

你不能傳遞屬於ConcreteClass的東西,因爲當調用基類的構造函數時該對象仍在構造中。因此當時不能使用它。

將抽象方法添加到基礎聽起來更合理。

3

而不是採取委託,有什麼理由不在基類中指定抽象方法,並在具體類中實現它?這將是實現這種事情的正常方式。

如果因爲其他原因需要委託,可以始終使用基類中的抽象方法創建它。 (還有其他一些時候,在構造函數參數中不能訪問Me/this有點痛苦;我在這裏感覺到你的痛苦,但我認爲使用抽象方法可能更適合這種情況你已經描述過了。)

+0

我一直在這太久。這就是我應該如何去做的。我不知道爲什麼我沒有想到它。抱歉浪費大家的時間。什麼是初學者犯的錯誤。 – uriDium 2010-02-15 12:37:19

1

在基類構造函數期間,只有對象的基類部分是完整的 - 它實際上只是一個BaseClass對象,直到ConcreteClass構造函數完成。因此,你將無法在基本ctor中調用DoSomethingHere。你不這樣做,但編譯器不知道,並且必須假設你會這樣做。

如果你把它變成一個靜態函數(將ConcreteClass作爲參數傳入),它應該可以工作。

相關問題