뭔가 이상한 점이있어서 재미 있었고 설명을 좋아할 것입니다. 이 질문은 의미하지 않는다동일한 클래스의 공유 함수에서 호출 할 때 오버로드 된 개인 공유 함수에 액세스 할 수없는 이유
편집은 그것을 해결하기 위해 수행해야 무엇으로 대답한다. 나는 그 수정 사항을 안다. 컴파일러가 왜 그렇게하는지에 대한 설명이 필요합니다. 전의. 이 시나리오에서 개인 기능이 고려되지 않았습니까?
문제
내가 whatis는라는 공공 공유 (정적) 함수가있는 클래스가 있습니다. WhatIs는 개체 컬렉션이있는 매개 변수를 사용합니다. 코드는이 컬렉션을 반복하고 개체가 무엇인지 유형과 일치하는 매개 변수가있는 WhatIs 함수를 호출합니다.
실행되면 InvalidCastException 예외는 시작된 WhatIs 함수를 호출하려고하므로 실행되지 않습니다.
이상하게 들리지만 개인 공유 기능을 공개 공유로 변경하면 나에게 이상한 점이 있습니다.
개체를 명시 적으로 캐스팅 할 때도 함수가 비공개 인 경우에도 작동합니다.
무엇?! 누군가가
코드
배짱이 설명해주십시오 :
Public Class House
Public Property Furniture As ICollection(Of Object)
Public Sub New()
Furniture = New List(Of Object)
End Sub
End Class
Public Class Chair
Public Property IsComfortable As Boolean
End Class
Public Class Table
Public Seats As Integer
End Class
Public Class HouseExaminer
Public Shared Function WhatIs(thing As House) As String
Dim isA As String = "a house that contains "
For Each item In thing.Furniture
isA &= WhatIs(item)
Next
Return isA
End Function
Private Shared Function WhatIs(thing As Chair) As String
Return "a " & If(thing.IsComfortable, "comfortable", "uncomfortable") & " chair "
End Function
Private Shared Function WhatIs(thing As Table) As String
Return "a table that seats " & thing.Seats & " iguanas"
End Function
End Class
테스트
Imports System.Text
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports stuff
<TestClass()>
Public Class HouseExaminerTests
<TestMethod()>
Public Sub TestWhatIs()
Dim given As New House()
Dim expected As String
Dim actual As String
given.Furniture.Add(New Chair() With {.IsComfortable = True})
given.Furniture.Add(New Table() With {.Seats = 4})
expected = "a house that contains a comfortable chair a table that seats 4 iguanas"
actual = HouseExaminer.WhatIs(given)
Assert.Equals(expected, actual)
End Sub
End Class
결과
,디버그 테스트 당신이 얻을 : InvalidCastException이 메소드 호출이 실패 때문에 '공개 공유 기능 whatis는 문자열로 (stuff.House로서 것)'이 인수로 호출 할 수 없습니다 :
인수 일치하는 매개 변수 '일' 'Chair'에서 'House'로 변환 할 수 없습니다.
이러한 변경으로 인해 효과가 있지만 왜 그렇습니까?!
메이크업 안에 공공
변화를 공개, 다시 실행 테스트에 HouseExaminer의 개인 공유 기능.스포일러, 그것은 그것을
가 명시 적으로
isA &= WhatIs(item)
If TypeOf item Is Chair Then isA &= WhatIs(CType(item, Chair))
If TypeOf item Is Table Then isA &= WhatIs(CType(item, Table))
다시 실행 테스트와
, 그리고 u는 무엇을 알 수 있습니까 대체 객체를 다시 민간에
변화를 캐스팅 작동 작품
옵션 추가 Strict On을 선택한 다음 모든 가구에서 지원되는 인터페이스를 정의합니다 (예 : iFurniture이며 객체가 문자열 반환 함수를 정의해야합니다. – Amegon
w.brian의 대답에 대한 반응을 참고하십시오 –