タイトル : Re: 基底関数の振る舞い 投稿日 : 2007/01/19(Fri) 12:19 投稿者 : Hongliang
> 質問はこのMyBase.OnTextChanged(e)はユーザーコントロールの > 基底関数のメソッドを呼ぶのではないのですか? > 私の中ではユーザーコントロールの基底関数はSystem.windows.formだと思うのですが? > 大きな勘違いがありそうです。 基底クラスのメソッドを呼び出します。TextBox クラスを継承しているのですから、TextBox.OnTex tChanged を呼び出します。 TextBox クラスは、リファレンスを辿ると分かりますが Object MarshalByRefObject Component Control TextBoxBase TextBox という順に派生しています。この次に作成なさっているユーザコントロールが来るわけですが。 基底と言うのはこのツリーを上に遡る方向で、派生(継承)は下に下りる方向です。 この継承ツリーのどこかで初めて OnTextChanged が定義され、以降のクラスはそれをそのまま使っ たりオーバーライドしたりするわけです。 当然、Form クラスなんてまったく関係ありません。 では何故 Form に TextBox1_TextChanged みたいなメソッドを書くと呼び出されるのかと言うと、 イベントという仕組み(Handles キーワードがポイント)を使って、OnTextChanged メソッドの内部 で TextBox1_TextChanged を呼び出しているからです。 もうちょっと詳しく言うと、Form は TextBox に「OnTextChanged が呼び出されたら TextBox1_Tex tChanged を呼んでくれ」と事前に言っているわけです(この「OnTextChanged が呼び出されたら」が TextChanged イベントです)。 オーバーライドした場合、派生クラスが基底クラスの同名メソッドを呼び出すかどうかは任意です 。 もし TextBox クラスから派生させたクラスで OnTextChanged をオーバーライドし、そこで MyBase .OnTextChanged、つまり TextBox の OnTextChanged を呼び出さなかった場合、TextBox の OnTextC hanged が実行されないため、当然ながら Form が事前に言っていた「TextBox1_TextChanged を呼ん でくれ」は意味を持たなくなります。 |