我来自Java背景。请查看下面的代码(例子来自我曾经阅读的Java书籍,代码转换为.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一致)
答案 0 :(得分:2)
a2
是对Horse
的引用。 Horse
有一个Eat
方法,需要string
。现在,如果第5行引用a1
,则会导致编译器错误。
答案 1 :(得分:1)
overload
eat()
string
horse
类overload
类eat(string)
类。这完全有效。
horse
是一个名称相同但参数不同的方法。您的重载animal
完全有效,并且在调用对象和{{1}}类型的引用时工作正常。
但是,您无法在{{1}}类型的对象或引用上调用它。