TIL

Today I Learned. 知ったこと、学んだことを書いていく

親クラスフォームで定義したメソッドを子クラスフォームでオーバーライドし、親側で子側で実装したメソッドを実行する - VB.net

まず、やりたい事は、以下のようなこと

f:id:tmg1998:20171201193324p:plain

キーイベントの処理を親クラスに定義しておき、子クラスでは、親クラスに定義されているメソッドをオーバーライドするだけで、「ボタンクリック時」と「キー押下時」の処理をまとめる。

これが今の自分の最善策だと思う。

ポイント

親クラス側(RootForm)

  • 親クラスのKeyUpイベント発生時のメソッド(RootForm_KeyUp())定義内で、子クラスがオーバーライドしたメソッド(F1Process()F2Process())を呼ぶこと
  • 子クラス側でのKeyUpイベント発生時に子クラスのオブジェクトを取得すること
  • 子クラスにオーバーライドしてもらうメソッドはPublicで定義すること
    • こうしないと、親側から子側でオーバーライドされたメソッドを呼び出すことができない(と思う)

子クラス側(Form1)

  • 親側のメソッド(F1Process()F2Process())をオーバーライドすること
    • こうすることで、親側で定義されたKeyUpイベント発生時に処理を実行できる
  • ボタンクリック時にオーバーライドしたメソッドを呼ぶこと

これで、キー押下時のイベントは意識せずにボタンクリック時の処理を記述することができる!!(?)


From1.vb

Public Class Form1
    Public Overloads Sub F1Process()
        MsgBox("F1!!!!")
    End Sub

    Public Overloads Sub F2Process()
        MsgBox("F2!!!!")
    End Sub

    Private Sub ButtonF1_Click(sender As Object, e As EventArgs) Handles ButtonF1.Click
        ' F1ボタンクリック時にもF1押下時と同じ処理を呼び出す
        F1Process()
    End Sub

    Private Sub ButtonF2_Click(sender As Object, e As EventArgs) Handles ButtonF2.Click
        ' F2ボタンクリック時にもF2押下時と同じ処理を呼び出す
        F2Process()
    End Sub
End Class

RootForm.vb

Public Class RootForm
    
    Private Sub RootForm_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
        
        ' 子フォームのFnProcess()を呼ぶため
        Dim form = CTypeDynamic(sender, sender.GetType())

        Select Case e.KeyCode
            Case Keys.F1
                form.F1Process()
            Case Keys.F2
                form.F2Process()
        End Select
    End Sub
    
    ''' <summary>F1キー押下時、F1ボタンクリック時の処理</summary>
    Public Overridable Sub F1Process()
        ' オーバーライドしてください
    End Sub

    Public Overridable Sub F2Process()
        ' オーバーライドしてください
    End Sub
    
End Class

参考文献

Conversion.CTypeDynamic Method (Microsoft.VisualBasic) | Microsoft Docs