3

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())、この強く型付けされたジェネリックメソッドはシャドウメソッドを呼び出すことはありません。

これはバグですか、それとも何かが足りませんか?

4

3 に答える 3

3

この動作は「設計による」ものです。ここで覚えておくべき秘訣は、ジェネリックメソッドがそれ自体でコンパイルおよび検証されることです(C ++で行われるような呼び出し元のコンテキストではありません)。Tしたがって、ジェネリックメソッドはそれがに関連していることだけを知っていFormます。の知識がないMyFormため、のメソッドに正しくバインドしますForm

Shadowsメソッドはコンパイル時に参照のタイプでのみ機能するため、これは正しいです。メソッドはShadowメソッドを表示します。コンパイルタイプでの参照タイプがそうであるため、これはここでは当てはまりFormません(そうではありません。これは、ランタイムタイプに基づいて動作が変化 MyForm)する場合とは対照的です。Overridable

于 2010-10-19T20:32:05.030 に答える
2

あなたは何かが欠けています。コンパイル時にフォームを処理していることだけを認識します(ジェネリックはテンプレートではないことに注意してください)。実行できる唯一のことは、仮想メソッドをシャドウイングする代わりに使用(オーバーライド)することです。

シャドウイングの詳細については、VB.NETの「シャドウ」と「オーバーライド」も参照してください。これは実際にはポリモーフィズムではありません。

于 2010-10-19T20:30:46.860 に答える
1

呼び出しは、に適用された特定の型制約、つまりに基づいて静的にコンパイラによって評価されるため、バグではありません。コンパイラーは、実際の型にシャドウメソッド宣言または既知の親(つまり)で宣言されていない他のメソッドが含まれる可能性があることを予測できません。TFormForm

于 2010-10-19T20:31:28.657 に答える