我有我大大簡化到以下的VB.Net類庫一個問題...與.net繼承和成員可見奇怪的問題
Public MustInherit Class TargetBase
End Class
Public Class TargetOne
Inherits TargetBase
End Class
Public Class TargetTwo
Inherits TargetBase
End Class
Public Class TargetManager
Public Sub UpdateTargets(ByVal Targets As List(Of TargetBase))
For Each objTarget As TargetBase In Targets
UpdateTarget(objTarget)
Next
End Sub
Private Sub UpdateTarget(ByVal Value As TargetOne)
End Sub
Private Sub UpdateTarget(ByVal Value As TargetTwo)
End Sub
End Class
這不會因爲編譯成語法在UpdateTarget(objTarget)
行錯誤 - 重載決策失敗,因爲沒有可訪問的「UpdateTarget」可以在不縮小轉換被稱爲
所以我改變了for-each循環使用的對象,而不是TargetBase ...
For Each objTarget As Object In Targets
UpdateTarget(objTarget)
Next
這現在編譯,但我得到一個運行時錯誤 - 未找到類型'TargetManager'上的公共成員'UpdateTarget'。
所以我採取了明顯的下一步使重載公開(而不是私有)。
Public Sub UpdateTarget(ByVal Value As TargetOne)
End Sub
Public Sub UpdateTarget(ByVal Value As TargetTwo)
End Sub
This now works!
我可以理解爲什麼將它改爲Object可行,但爲什麼只有在同一個類中調用它們時,才能將這些方法設爲Public? - 我寧願它們在這個類之外不可用。
有人可以解釋一下嗎?
在此先感謝(和抱歉這一問題的長度!)
附加 感謝大家的答案爲止。我有解決方法(使UpdateTarget方法公開),使其工作。另一種解決辦法是做objTarget然後DirectCast一個TypeOf運算檢查調用UpdateTarget,像以前一樣......
For Each objTarget As Object In Targets
If TypeOf objTarget Is TargetOne Then
UpdateTarget(DirectCast(objTarget, TargetOne))
ElseIf TypeOf objTarget Is TargetTwo Then
UpdateTarget(DirectCast(objTarget, TargetTwo))
End If
Next
這也將工作 - 我張貼的問題,因爲我真的想明白爲什麼更改UpdateTarget的知名度私下公開擺脫運行時錯誤,完全違揹我的理解!
您的意思是結構化你的UpdateTarget方法,如這個?您是不是想要在每個TargetBase子類中都有一個UpdateTarget方法?然後你可以調用objTarget.UpdateTarget。你之前可能得到了這個編譯錯誤,因爲.net不知道它傳遞了哪個類(縮小轉換) – jrsconfitto 2010-07-15 14:08:25
只是出於好奇「這現在起作用」的含義 - 它調用TargetBase類型的相關方法(即正確);或者它總是調用其中一種方法? – 2010-07-15 14:16:02
@Jugglingnutcase - 謝謝你的回答。我已經考慮過了,不幸的是這是不可能的。我展示的代碼示例非常簡單(只是爲了說明問題) - 在我的實際項目中,我無法訪問TargetBase,因此無法向其添加UpdateTarget方法。 – barrylloyd 2010-07-15 14:24:07