代码之家  ›  专栏  ›  技术社区  ›  Rob

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

  •  3
  • Rob  · 技术社区  · 14 年前

    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()) ,的阴影实现 显示() 正确调用。现在考虑以下通用实现:

    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 回复  |  直到 13 年前
        1
  •  3
  •   JaredPar    14 年前

    这种行为是“故意的”。这里要记住的技巧是,泛型方法是由自己编译和验证的(而不是在调用方的上下文中,如C++中所做的那样)。因此泛型方法只知道 T Form . 它不知道 MyForm 因此正确绑定到 形式 .

    这是正确的,因为 Shadows Shadow 方法可见。这里不是这样,因为compile type的引用类型是 形式 (不是 MyForm) Overridable 其中行为根据运行时类型更改。

        2
  •  2
  •   Community Dan Abramov    7 年前

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

    'Shadows' vs. 'Overrides' in VB.NET 关于阴影的更多信息-这实际上不是多态性。

        3
  •  1
  •   Ondrej Tucny    14 年前

    静态的 T ,即 Form . 编译器无法预测实际类型可能包含带阴影的方法声明或已知父级中未声明的任何其他方法(即。 形式 ).