我來自Java背景。請看看下面的代碼(例如,從一個Java的書我曾經讀過拍攝並轉換成.NET代碼):.NET - 重載和重載方法中的多態性
Public Class Animal
Public Overridable Sub Eat()
MsgBox("Animal Eat no arguement")
End Sub
End Class
Public Class Horse
Inherits Animal
Public Overrides Sub Eat()
MsgBox("Horse Eat no arguement")
End Sub
Public Overloads Sub Eat(ByVal food As String)
MsgBox("Horse Eat food arguement")
End Sub
End Class
Public Class Form1
Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim a1 As New Animal
Dim a2 As New Horse
a1.Eat()
a2.Eat()
a2.Eat("Fruit") 'line 5
End Sub
End Class
我希望在Form_Load的第5行,產生一個編譯時錯誤。在Java中,編譯器會查看引用並查看Animal沒有使用String的Eat方法。爲什麼在.NET中沒有編譯錯誤?
更新 上述代碼有錯誤。正如答覆者指出的那樣; a2是馬的引用和實例。因此第5行不會導致編譯時錯誤。如果a2引用了一個動物並創建了一個馬的實例,那麼將出現編譯時錯誤(與Java一致)
謝謝。我意識到它在.NET中是有效的。然而,在我的Java教科書中,它說:「編譯器查看引用,並看到動物沒有一個接受字符串的吃法,編譯器不關心實際對象在運行時可能是馬。 – w0051977 2012-07-22 21:17:55
你的代碼在'horse'上調用'吃(串)'。不是'動物'。 – 2012-07-22 21:18:33
對象是一匹馬,但參考是一隻動物。在Java教科書中,它說:「引用類型(不是對象類型)決定調用哪個重載方法。總之,基於對象類型,在運行時決定重寫要調用的方法的版本,但是重載的版本要調用的方法基於在編譯時傳遞的參數的引用類型「。 – w0051977 2012-07-22 21:22:22