0

私は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 に文字列を取る Eat メソッドがないことを確認します。.NET でコンパイル エラーが発生しないのはなぜですか?

更新 上記のコードにエラーがあります。回答者が指摘するように; a2 は Horse への参照であり、Horse のインスタンスです。したがって、5行目でコンパイル時エラーが発生しないのはなぜですか。a2 が動物を参照して馬のインスタンスを作成した場合、コンパイル時エラーが発生します (Java と一致)。

4

2 に答える 2

2

a2への参照Horseです。HorseEat取るメソッドがありstringます。5 行目が を参照a1していると、コンパイラ エラーが発生します。

于 2012-07-22T21:14:21.357 に答える
1

クラスで引数をoverload受け入れるeat()バージョンを使用しています。それは完全に有効です。stringhorse

Anoverloadは、同じ名前で引数が異なるメソッドです。オーバーロードeat(string)されたものは完全に有効であり、オブジェクトと type の参照で呼び出されたときに正常に動作しますhorse

ただし、 type のオブジェクトまたは参照で呼び出すことはできませんanimal

于 2012-07-22T21:15:20.397 に答える