gpt4 book ai didi

vb.net - 强类型泛型方法调用其参数的基类方法,而不是 T 中的隐藏方法?

转载 作者:行者123 更新时间:2023-12-01 11:07:22 25 4
gpt4 key购买 nike

考虑一个 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++ 中那样在调用者的上下文中)。因此,泛型方法只知道 TForm 相关。它不知道 MyForm,因此正确绑定(bind)到 Form 上的方法。

这是正确的,因为 Shadows 方法只在编译时与引用类型一起使用,使 Shadow 方法可见。这里不是这种情况,因为编译类型的引用类型是 Form(不是 MyForm)。这与 Overridable 相反,后者的行为会根据运行时类型而改变。

关于vb.net - 强类型泛型方法调用其参数的基类方法,而不是 T 中的隐藏方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com