2012-03-06 4 views
2

シャドーやオーバーロードについてはVB.netが非常に奇妙だと知っていましたが、これは完全にわかりません。関数で使用するとシャドウが奇妙に動作する

次のようなモデルで作業しています。親クラス:

Public Class Base 
    Function F() As String 
     Return "F() in Base Class" 
    End Function 

    Function F(ByVal n As Integer) As String 
     Return "F(" + n.ToString() + ") in Base Class" 
    End Function 
End Class 

と、この:

Class Derived 
    Inherits Base 
    Shadows Function F() As String 
     Return "-" 
    End Function 
End Class 

次のことを実行している場合:

Sub Main() 
    Dim parent As Base = New Base() 
    Dim child As Derived = New Derived() 

    Console.WriteLine(parent.F()) 
    Console.WriteLine(parent.F(1)) 
    Console.WriteLine("------------") 

    Console.WriteLine(child.F()) 
    Console.WriteLine(child.F(1)) 'this should not compile, due to the shadow keyword. 

    Console.Read() 
End Sub 

IndexOutOfRangeExceptionがスローされます。さらに、(派生クラスで)変更するとき: " - " の場合は "派生クラスのFunc"を返す コンソールは文字 'u'を出力します。 誰かがこれの理由を知っていますか?

答えて

3

あなたのコードされますパラメータを持つ関数を呼び出すのではなく、文字列のインデックスを作成します。 String.Charsがデフォルトプロパティなので、あなただけではインデックスで、それを参照することができ

Dim childFResult As String = child.F() 
Dim character As Char = F.Chars(1) ' Failure here. 
Console.WriteLine(character) 

Console.WriteLine(child.F(1)) 

この行はに拡大されます。あなたの文字列には1文字しか含まれていないので、インデックス1には文字はありません。

5

Fは文字列なので、インデックスを指定すると、整数パラメータの2番目の関数ではなく、文字列のインデックスが参照されます。 「u」は、あなたの例えばインデックス1

で指定された「FUNC」の2番目の文字は、ある、あなたも、第2の機能をシャドウする必要があります

Class Derived 
    Inherits Base 

    Shadows Function F() As String 
    Return "-" 
    End Function 

    Shadows Function F(ByVal n As Integer) As String 
    Return "X" 
    End Function 
End Class 
3

vb.netの構文のあいまいさは、 'メソッド呼び出し'と '配列インデックス'の両方を意味します。あなたは配列インデックスバージョンを持って、インデックス1はF()によって返された文字列の範囲外です。換言すれば、コンパイラはこれをコンパイルします。これに

Console.WriteLine(child.F(1)) 

Dim temp1 As String = child.F() 
Dim temp2 As Char = temp1(1) 
Console.WriteLine(temp2) 

番目のステートメントは、例外が発生します。 C'est la vie。

関連する問題