.NET - 重载和重写方法中的多态

时间:2012-07-22 21:12:05

标签: .net vb.net

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

2 个答案:

答案 0 :(得分:2)

a2是对Horse的引用。 Horse有一个Eat方法,需要string。现在,如果第5行引用a1,则会导致编译器错误。

答案 1 :(得分:1)

overload eat() string horseoverloadeat(string)类。这完全有效。

horse是一个名称相同但参数不同的方法。您的重载animal完全有效,并且在调用对象和{{1}}类型的引用时工作正常。

但是,您无法在{{1}}类型的对象或引用上调用它。

相关问题