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

标签 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()) 调用,此强类型泛型方法从不调用隐藏方法。

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

最佳答案

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

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

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

相关文章:

vb.net - 打印/图形问题

c# - 项目 <PROJECT NAME> 不是最新的。缺少输入文件 'netframework,version=v4.0,profile=client.assemblyattributes.cs

.net - 用于在 vb.net 和 vs2012 中解压缩 RAR 存档的 DLL 文件

c# - HtmlAgilityPack 的 Html 节点问题

具有继承性的 Java 接口(interface)

asynchronous - 用于图像哈希的 Flutter 计算函数

c# - 将强类型属性名称作为参数传递

c# - 为什么使用命名空间以一种不直观的方式工作?

C# 模板和特殊构造函数

python 强/弱动态/静态类型语言?