2012-03-06 3 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

귀하의 코드는 매개 변수가있는 함수를 호출하는 것이 아니라 문자열을 색인화합니다. 기본 속성은

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

String.Chars 때문에, 당신은 혼자 인덱스로 참조 할 수 있습니다 :

Console.WriteLine(child.F(1)) 

이 줄

가 확장됩니다. 문자열에는 문자가 하나만 있으므로 인덱스 1에는 문자가 없습니다.

5

F는 문자열이므로 인덱스를 지정할 때 정수 매개 변수가있는 두 번째 함수가 아니라 문자열의 인덱스를보고 있습니다.

"유"를 예를 들어 인덱스 1

에 의해 지정된 "FUNC"의 두 번째 문자가, 당신도 두 번째 기능을 그림자해야합니다 :

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.

관련 문제