tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 を呼ん
でくれ」は意味を持たなくなります。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。