强类型泛型方法调用其参数的基类方法,而不是T中的阴影方法?

时间:2010-10-19 20:26:27

标签: vb.net generics strong-typing shadowing

考虑一个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())调用此强类型泛型方法永远不会调用阴影方法。

这是一个错误,还是我错过了什么?

3 个答案:

答案 0 :(得分:3)

此行为是“按设计”。这里要记住的诀窍是泛型方法是由它自己编译和验证的(不像在C ++中那样在调用者的上下文中)。因此,通用方法仅知道TForm相关。它不了解MyForm,因此正确绑定Form上的方法。

这是正确的,因为Shadows方法仅在编译时使用引用的类型,使Shadow方法可见。这不是这种情况,因为编译类型的引用类型是Form(而不是MyForm)。这与行为根据运行时类型更改的Overridable形成对比。

答案 1 :(得分:2)

你错过了什么。它只知道它在编译时处理一个Form(请记住,泛型不是模板!)。你唯一能做的就是使用(覆盖)虚拟方法而不是遮蔽它们。

有关阴影的更多信息,请参阅'Shadows' vs. 'Overrides' in VB.NET - 这实际上并不是多态性。

答案 2 :(得分:1)

这不是一个错误,因为调用由编译器静态根据应用于T的给定类型约束(即Form)进行评估。编译器无法预测实际类型可能包含阴影方法声明或未在已知父级中声明的任何其他方法(即Form)。