【学習】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は、必要になったタイミングで別の記事で触れると負担が少ないです。


プロパティが多い理由

結論はシンプルです。

Button は Control クラスの機能をそのまま引き継いでいる

そのうえで、Button らしさ(見た目やクリックの振る舞いなど)が 追加 されています。だからプロパティウィンドウには、「コントロール共通」と「ボタンらしい項目」が 両方 並びます。


Button 自身の機能(ほんの一部)

Button らしいプロパティの例です。

  • Text
  • Image
  • FlatStyle

実際に使っている機能(ほとんどこれ)

次のような項目は、授業の最初のうち とくによく触る 部類です。

  • Size
  • Location
  • BackColor
  • Font
  • Enabled
  • Visible

これらは Button 専用というより、Control 側の機能 として理解できます。


継承とは何か(ここが重要)

継承 とは、

あるクラスが、別のクラスの性質(メンバーや振る舞い)を引き継ぐこと

です。WinForms では「画面に載る部品」が共通の親を持つので、見た目は違っても、土台のプロパティやメソッドが共通 になります。


is-a の関係で考える

継承が成り立つかどうかは、次の一文で判断できます。

「○○ は △△ の一種か?」


正しい例

  • Button is a Control
  • Label is a Control
  • TextBox is a Control

いずれも 「画面に載るコントロールの一種」 として成立します。


間違えやすい例(重要)

次のような例は is-a としては成立しません

  • アプリ is a スマホ ❌

スマホの上でアプリが 動いている のは、所有・利用(中に含まれる・使う) の関係です。

👉 利用(has-a)の関係 と整理します。


整理すると

種類関係
継承is-aButton is a Control
利用has-aアプリ has a スマホ(の上で動く、など)

継承のメリット

同じ 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 の機能を土台として持ったクラス です。プロパティウィンドウを見るたびに 「これは共通? ボタン専用?」 と分ける癖をつけると、あとで楽になります。


次のステップ

訪問数 4 回, 今日の訪問数 4回

広告