3

Consider a MyForm class that contains a shadowed implementation of Show(). It also contains a CreateForm() method, which accepts an instance of the form and calls the shadowed sub:

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

When called with CreateForm(New MyForm()), the shadowed implementation of Show() is correctly called. Now consider the following generic implementation:

Public Sub CreateForm(Of T As Form)(ByVal childForm As T)
    childForm.MdiParent = Me
    childForm.Show()
    childForm.Focus()
End Sub

Called with CreateForm(Of MyForm)(New MyForm()), this strongly-typed generic method never invokes the shadowed method.

Is this a bug, or am I missing something?

4

3 回答 3

3

此行为是设计使然”。这里要记住的技巧是泛型方法是由自身编译和验证的(而不是在调用者的上下文中,就像在 C++ 中所做的那样)。因此,泛型方法只知道T与 相关Form。它不知道MyForm并因此正确绑定到Form.

这是正确的,因为Shadows方法仅在编译时与引用的类型一起发挥作用,使Shadow方法可见。这不是这里的情况,因为 compile 类型的引用类型是Form(not MyForm)。这与Overridable行为根据运行时类型发生变化的地方形成对比。

于 2010-10-19T20:32:05.030 回答
2

你错过了一些东西。它只知道它在编译时处理一个表单(请记住,泛型不是模板!)。您唯一能做的就是使用(覆盖)虚拟方法而不是隐藏它们。

有关阴影的更多信息,另请参见VB.NET 中的“阴影”与“覆盖” - 这实际上不是多态性。

于 2010-10-19T20:30:46.860 回答
1

这不是错误,因为编译器根据应用于 的给定类型约束T(即Form. 编译器无法预测实际类型可能包含隐藏的方法声明或任何其他未在已知父级(即Form)中声明的方法。

于 2010-10-19T20:31:28.657 回答