考虑一个 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())
调用,此强类型泛型方法从不调用隐藏方法。
这是一个错误,还是我遗漏了什么?
最佳答案
此行为是“设计使然”的。这里要记住的技巧是泛型方法是自己编译和验证的(而不是像在 C++ 中那样在调用者的上下文中)。因此,泛型方法只知道 T
与 Form
相关。它不知道 MyForm
,因此正确绑定(bind)到 Form
上的方法。
这是正确的,因为 Shadows
方法只在编译时与引用类型一起使用,使 Shadow
方法可见。这里不是这种情况,因为编译类型的引用类型是 Form
(不是 MyForm)
。这与 Overridable
相反,后者的行为会根据运行时类型而改变。
关于vb.net - 强类型泛型方法调用其参数的基类方法,而不是 T 中的隐藏方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972457/