考虑一个MyForm
类,其中包含Show()
的阴影实现。它还包含一个CreateForm()
方法,它接受表单的一个实例并调用阴影子:
Public Class MyForm
Inherits Form
Public Shadows Sub Show()
MessageBox.Show("Shadowed implementation called!")
End Sub
End Class
...
Public Sub CreateForm(ByVal childForm As MyForm)
childForm.MdiParent = Me
childForm.Show()
childForm.Focus()
End Sub
使用CreateForm(New MyForm())
调用时,正确调用了Show()
的阴影实现。现在考虑以下通用实现:
Public Sub CreateForm(Of T As Form)(ByVal childForm As T)
childForm.MdiParent = Me
childForm.Show()
childForm.Focus()
End Sub
使用CreateForm(Of MyForm)(New MyForm())
调用此强类型泛型方法永远不会调用阴影方法。
这是一个错误,还是我错过了什么?
答案 0 :(得分:3)
此行为是“按设计”。这里要记住的诀窍是泛型方法是由它自己编译和验证的(不像在C ++中那样在调用者的上下文中)。因此,通用方法仅知道T
与Form
相关。它不了解MyForm
,因此正确绑定Form
上的方法。
这是正确的,因为Shadows
方法仅在编译时使用引用的类型,使Shadow
方法可见。这不是这种情况,因为编译类型的引用类型是Form
(而不是MyForm)
。这与行为根据运行时类型更改的Overridable
形成对比。
答案 1 :(得分:2)
你错过了什么。它只知道它在编译时处理一个Form(请记住,泛型不是模板!)。你唯一能做的就是使用(覆盖)虚拟方法而不是遮蔽它们。
有关阴影的更多信息,请参阅'Shadows' vs. 'Overrides' in VB.NET - 这实际上并不是多态性。
答案 2 :(得分:1)
这不是一个错误,因为调用由编译器静态根据应用于T
的给定类型约束(即Form
)进行评估。编译器无法预测实际类型可能包含阴影方法声明或未在已知父级中声明的任何其他方法(即Form
)。