親クラスフォームで定義したメソッドを子クラスフォームでオーバーライドし、親側で子側で実装したメソッドを実行する - VB.net
まず、やりたい事は、以下のようなこと
キーイベントの処理を親クラスに定義しておき、子クラスでは、親クラスに定義されているメソッドをオーバーライドするだけで、「ボタンクリック時」と「キー押下時」の処理をまとめる。
これが今の自分の最善策だと思う。
ポイント
親クラス側(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