2012-07-22 61 views
0

我來自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一致)

回答

1

你是overload ing eat()的版本接受horse類中的string arg。這完全有效。

overload是一個名稱相同但參數不同的方法。你的超載eat(string)是完全有效的,並且在horse類型的對象和引用上調用時工作得很好。

儘管如此,您無法在對象或類型爲animal的引用上調用它。

+0

謝謝。我意識到它在.NET中是有效的。然而,在我的Java教科書中,它說:「編譯器查看引用,並看到動物沒有一個接受字符串的吃法,編譯器不關心實際對象在運行時可能是馬。 – w0051977 2012-07-22 21:17:55

+1

你的代碼在'horse'上調用'吃(串)'。不是'動物'。 – 2012-07-22 21:18:33

+0

對象是一匹馬,但參考是一隻動物。在Java教科書中,它說:「引用類型(不是對象類型)決定調用哪個重載方法。總之,基於對象類型,在運行時決定重寫要調用的方法的版本,但是重載的版本要調用的方法基於在編譯時傳遞的參數的引用類型「。 – w0051977 2012-07-22 21:22:22

2

a2是對Horse的引用。 Horse有一個Eat方法需要string。現在如果第5行引用a1,那會導致編譯器錯誤。

+0

+1首先澄清。 – w0051977 2012-07-22 21:40:42