次のページへControlクラスとその派生クラスあるインスタンスを、基本クラスのインスタンスとして扱うという仕組みはクラス・ライブラリの至る所で利用されています。Windowsアプリケーションでいえば、コントロールの親子関係が分かりやすい一例です。これについて見ていきます。■Controlクラスのクラス階層ボタンやテキスト・ボックスなどのコントロールの実体は、クラス・ライブラリでButtonクラスやTextBoxクラスにより定義されています。これらはすべてControlクラスの派生クラスとなっています。次の図3は、Controlクラスから継承しているいくつかのコントロールのクラス階層を図示したものです。Controlクラスの派生クラスたち(一部)これらすべてのクラスのオブジェクトは、Controlクラスのオブジェクトとして扱うことができる。この図の一番下にあるように、WindowsフォームであるFormクラスは、Controlクラスの(間接的な)派生クラスです。ボタンやチェック・ボックス、コンボ・ボックスなどのコントロールも、Controlクラスから直接的に派生したクラスではありませんが、基本クラスのインスタンスはさらにその基本クラスのインスタンスとして扱うことができるので、この図にあるクラスのインスタンスは、すべてのContorolクラス型として参照できます。ちなみに、このようなクラスの階層はリファレンス・マニュアルから知ることができます。Controlクラスを調べると次のような記述(図4左)があります。ここで「派生クラス」をクリックすると、Controlクラスを継承しているクラスが現れます(図4右)。リファレンス・マニュアルにあるControlクラスの階層クラスの派生クラスを調べるには、まずそのクラスを検索し、「派生クラス」の部分をクリックする(そのクラスに派生クラスがある場合)。■コントロールの親子関係ここで、次のようなデザインのWindowsフォームを考えてみましょう。フォームに2つのButtonコントロールと1つのGroupBoxコントロールをまず配置し、さらにGroupBoxコントロール上には2つのRadioButtonコントロールを配置します。この場合、2つのRadioButtonコントロールはGroupBoxコントロールによりグループ化されます。コントロールを配置したWindowsフォームグループ・ボックス(GroupBoxコントロール)内に配置された2つのラジオ・ボタン(RadioButtonコントロール)は、グループ・ボックスによりグループ化されている。.NETにより自動的に設定されます。2つのButtonコントロールとGroupBoxコントロールはフォームの子コントロールです。同様に、2つのRadioButtonコントロールはGroupBoxコントロールの子コントロールとなります。フォーム(図5)に配置したコントロールの親子関係2つのボタンはフォームの子コントロールであるが、2つのラジオ・ボタンはグループ・ボックスの子コントロールである。ここでは詳しくは述べませんが、親子関係にあるコントロールは、親コントロールを移動させるとその子コントロールも移動する、子コントロールは親コントロール内にしか描画できない、子コントロールは親コントロールよりも常に手前(前面)になる、などの特徴があります。■コントロールのコレクションであるControlsプロパティさて、このような親子関係を実現しているのは、Controlクラスで定義されているControlsプロパティです。このプロパティによりアクセスできるオブジェクト*1は、内部的に複数のコントロール(への参照)を保持することができます。このような複数のオブジェクトを保持できるオブジェクトは「コレクション・オブジェクト」と呼ばれます。実際には、このオブジェクトはControl.ControlCollectionクラスのオブジェクトです。Class)」と呼ばれます。このクラスはControlクラスで利用されることがメインなので、入れ子クラスとして定義されています。すべてのコントロールはControlクラスを継承しているため、すべてのコントロールがControlsプロパティを持っています。このため、次の図7のようにコントロールはほかのコントロールを子コントロールのコレクションとして保持することができます。Controlsプロパティによるコントロールの親子関係すべてのコントロールはControlクラスの派生クラスなので、Controlsプロパティを持っている。このプロパティは、ほかのコントロールをコントロール・コレクションとして保持できる。このControlsプロパティは「Add」というメソッドを持っており、このAddメソッドにより、コントロールをコレクションに追加することができます。Addメソッドのパラメータには、追加するコントロールを指定します。いうまでもなく、Addメソッドのパラメータの型はControl型です。.NET(以降、VS.NET)を使ってフォーム上にデザインし、VS.NETで生成させたコードから、コントロールのインスタンス化とControlsプロパティへの設定の部分を抜き出したものです(C#のコード。VB.NETでは「this」の部分が「Me」になります)。.NETにより生成されたC#のコード(抜粋)図5のフォームに対して自動生成されたコードから、コントロールのインスタンス化とControlsプロパティへの設定の部分を抜き出したもの。デザイナで生成されたコード」として(VS.NETのアウトライン機能により)隠されている。ちなみに、「this」や「Me」はC#およびVB.NETのキーワードで、自分自身のインスタンスを参照するために使用するものです。上記のコードでは、thisがなくてもコンパイルは可能です。これについては次回で解説する予定です。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。