這是一個具有挑戰性的問題,在我今天編寫代碼的過程中讓我難以置信。假如我是運行Sub Test1()
和Test2()
,想打印出比如我傳遞到TestCall()
對象的Shadows
方法的價值(見下文 - 這是更清晰),使用下列限制:如何通過父類的類型來調用父類的實現
- 不能改變的
Class A
,B
的內容,和C
- 無法變更
Sub Test1()
和Sub Test2()
- TESTCALL()不能具有
if
,select case
等c。聲明試圖找出傳入的參數的類型,然後執行CType(o, <C or B>).Method()
。假設有類像B
和C
無限數量的所有這些從A
或B
或C
繼承和陰影Method
- 你不能改變替補的屬性(即你不能改變
Shadows
至Overridable/Overrides
)
我願做動態的CType(o, C).Method()
相媲美,並打印出C.Method
爲Test1的,然後做動態的CType(o, B).Method()
相媲美,並打印出B.Method
。
<TestFixture()> _
Public Class Test
<Test()>
Public Sub Test1()
Dim o As A = New C
TestCall(o) '<-- THIS SHOULD PRINT "C.Method"
End Sub
Public Sub Test2()
Dim o As A = New B
TestCall(o) '<-- THIS SHOULD PRINT "B.Method"
End Sub
Public Sub TestCall(ByVal o as A)
o.Method()
End Sub
Class A
Public Sub Method()
Console.WriteLine("A.Method")
End Sub
End Class
Class B
Inherits A
Public Shadows Sub Method()
Console.WriteLine("B.Method")
End Sub
End Class
Class C
Inherits B
Public Shadows Sub Method()
Console.WriteLine("C.Method")
End Sub
End Class
End Class
在本質上你問:如何調用遮蔽方法,就好像它是壓倒一切的方法,正確嗎? – Abel
本質上是的 – Denis