【学習】WinFormsで学ぶ「継承」入門(なぜButtonのプロパティはあんなに多いのか)
WinForms で Button を配置すると、プロパティウィンドウに 大量の項目 が表示されます。
- Size
- Location
- BackColor
- Font
- Enabled
- Visible
- Dock
- Anchor
「Button ってこんなに機能あったっけ?」と感じたことはないでしょうか。
今回は、その正体が 継承 だと分かると、プロパティの見方や「まとめて同じ操作をする」コードの意味がつながります。
シリーズ目次: WinFormsで学ぶ「継承」入門(シリーズ目次)
今日学ぶこと
- Button のプロパティが多い理由 … 多くは
Controlから受け継いでいる - 継承 … 別のクラスの性質を引き継ぐこと
- is-a と has-a … 継承で使えるかどうかの見分け方
Controlとしてまとめて扱う …foreachで共通プロパティにアクセスするイメージ
Button を置くとプロパティが大量に見える
プロパティウィンドウを開くと、見た目・配置・有効/無効など、さまざまな項目が並びます。これらの多くは、「Button だから」というより「画面に載る部品(コントロール)だから」 そろっているものです。
Button クラスの正体
実は、Button が 単独で これらすべての機能を持っているわけではありません。
.NET のクラス定義では、おおまかに次のような 派生(継承)の連なり になっています(public class Button : ButtonBase のイメージ)。
public class Button : ButtonBase
{
// ...
}
さらに遡ると、次のような階層になっています。
Button
└ ButtonBase
└ Control
└ Component
└ Object
授業や記事では、まず 「Button は Control の一種」 と押さえると足がかりになります。Component や Objectは、必要になったタイミングで別の記事で触れると負担が少ないです。
Visual Studioで継承関係を確認してみよう
ここまで見てきた継承関係は、Visual Studioの「オブジェクト ブラウザー」で実際に確認できます。クラス名だけで暗記せず、開発ツール上でたどれることを知っておくと、知らないコントロールに出会ったときにも自分で調べられます。
- メニューの「表示」から「オブジェクト ブラウザー」を開く
- 検索欄に
buttonと入力する System.Windows.Forms.Buttonを選択する- 左側の「基本型」を展開する

画面では、Button → ButtonBase → Control → Component というつながりをたどれます。これは、先ほどコードで確認した継承の階層と同じです。
なお、Visual Studioのバージョンや画面構成によって表示位置は少し異なることがありますが、確認する内容は同じです。
プロパティが多い理由
結論はシンプルです。
Button は Control クラスの機能をそのまま引き継いでいる
そのうえで、Button らしさ(見た目やクリックの振る舞いなど)が 追加 されています。だからプロパティウィンドウには、「コントロール共通」と「ボタンらしい項目」が 両方 並びます。
Buttonクラスが直接持つプロパティは意外に少ない
.NET 10のButtonクラスが直接公開している代表的なプロパティは、AutoSizeModeとDialogResultです。学習用にプロパティだけを抜き出すと、次のようなイメージになります。
public class Button : ButtonBase
{
public AutoSizeMode AutoSizeMode { get; set; }
public DialogResult DialogResult { get; set; }
}
これはButtonクラスの完全なソースコードではありません。「Button自身が追加しているプロパティは意外に少ない」ことを確認するための簡略図です。
プロパティを宣言しているクラスで分けてみよう
| 宣言しているクラス | プロパティ例 |
|---|---|
Button | AutoSizeMode、DialogResult |
ButtonBase | Text、Image、FlatStyle、BackColor |
Control | Size、Location、Font、Enabled、Visible、Dock、Anchor |
プロパティウィンドウに多くの項目が表示されるのは、Button自身がすべてを定義しているからではありません。ButtonBaseやControlから受け継いだプロパティも、Buttonのプロパティとしてまとめて表示されるためです。
継承とは何か(ここが重要)
継承 とは、
あるクラスが、別のクラスの性質(メンバーや振る舞い)を引き継ぐこと
です。WinForms では「画面に載る部品」が共通の親を持つので、見た目は違っても、土台のプロパティやメソッドが共通 になります。
is-a の関係で考える
継承が成り立つかどうかは、次の一文で判断できます。
「○○ は △△ の一種か?」
正しい例
- Button is a Control
- Label is a Control
- TextBox is a Control
いずれも 「画面に載るコントロールの一種」 として成立します。
間違えやすい例(重要)
次のような例は is-a としては成立しません。
- アプリ is a スマホ ❌
スマホの上でアプリが 動いている のは、所有・利用(中に含まれる・使う) の関係です。
👉 利用(has-a)の関係 と整理します。
整理すると
| 種類 | 関係 | 例 |
|---|---|---|
| 継承 | is-a | Button is a Control |
| 利用 | has-a | アプリ has a スマホ(の上で動く、など) |
継承のメリット
同じ Control を継承しているので、Control 型としてまとめて扱える ことが大きなメリットです。
実例コード
フォームに載っている 直下の子コントロール を列挙し、それぞれの背景色を変える例です。
このコードは、まず「種類の異なる部品を Control 型としてまとめて扱える」ことを読み取るための例です。完成手順をそのまま写すのではなく、各行が何をしているか考えてみましょう。
foreach (Control c in this.Controls)
{
c.BackColor = Color.Red;
}
考えてみよう:画面を開いた直後に色を変える場合と、ボタンを押したときに色を変える場合では、このコードをどこに書けばよいでしょうか。
記述場所は、コードをいつ実行したいかによって変わります。実際に試すときは、目的に合うフォーム内のイベント処理を選びます。
Controls は 直下の子だけ です。入れ子になったパネルの中まで一気に辿る話は、別の回(コントロールの親子と列挙)で扱うと整理しやすいです。
何が起きるか
- Button → 赤になる
- Label → 赤になる
- TextBox → 赤になる
型は違っても、Control として同じように BackColor を触れます。
なぜこれが重要なのか
違う見た目の部品を、同じ型(の基準)で扱える
これがオブジェクト指向でよく言われる 再利用・拡張・まとめて処理 の入り口です。次の回では、MyButton のように 自分でクラスを派生させる 体験へつなげられます。
まとめ
- Button のプロパティが多い理由の多くは 継承(親クラスから受け継いでいる)
- よく触る見た目・配置まわりは
Control側の機能 として理解できる - 継承は 「is-a」 で判断する
- has-a(利用) と混同しない
- 同じ親を持つことで
Controlとしてまとめて扱える
授業での一言
Button は「ボタン専用の小さなクラス」だけではなく、Control の機能を土台として持ったクラス です。プロパティウィンドウを見るたびに 「これは共通? ボタン専用?」 と分ける癖をつけると、あとで楽になります。
次のステップ
- 次は実際に継承を使う: シリーズ目次から、
MyButton・共通処理・ポリモーフィズムへ進む - 親子と
Controls: WinFormsの「ドラッグ&ドロップ」の正体シリーズ









ディスカッション
コメント一覧
まだ、コメントがありません