継承はもう使っている 〜WinFormsで理解するやさしい導入〜

継承という言葉を聞くと、

  • 難しそう
  • オブジェクト指向の山場
  • 抽象的で分からない

と感じる人が多いです。

ですが安心してください。

みなさんは、すでに継承を使っています。

今回はそれに「気づく」ことが目的です。


1. 継承とは何か

継承とは、

あるクラスの機能を引き継ぎながら、新しいクラスを作ること

です。

重要なのは、

  • コピーではない
  • 元の機能を持ったまま拡張する

という点です。


2. すでに書いている継承コード

WinFormsで必ず見ているこのコード。

public partial class Form1 : Form

この「: Form」が継承です。

意味はこうです。

Form1 は Form の機能を引き継いでいる

だから、

  • ウィンドウとして表示できる
  • ボタンを配置できる
  • イベントが使える

のです。

継承を学んでいなくても、すでに使っています。


3. Buttonも継承している

Buttonも単独の存在ではありません。

内部では次のような関係になっています。

Button は Control を継承しています。

だから、

  • 位置を持てる
  • サイズを持てる
  • Clickイベントがある

のです。


4. 自分たちでも作れる

では、自分で継承してみましょう。

public class MyButton : Button
{
}

これだけで、

  • Buttonの機能を持った
  • 新しいクラス

が作れます。

まだ何も追加していません。

それでも「Buttonとして」動きます。

これが継承です。


5. 少しだけ拡張してみる

public class MyButton : Button
{
    public string Category { get; set; }
}

Buttonの機能はそのまま。

でも、

  • 自分専用のプロパティ

を追加できます。

これが

「引き継ぎながら拡張する」

という意味です。


6. 今はここまでで十分

継承にはさらに

  • virtual
  • override
  • base

といった仕組みがあります。

ですが、今はやりません。

今理解してほしいのは、

✔ 継承は特別なものではない

✔ もう使っている

✔ クラスが安定していれば怖くない

ということです。


まとめ

  • Form1はFormを継承している
  • ButtonもControlを継承している
  • 私たちも作れる
  • 難しい単元ではない

継承は「新しい山」ではありません。

クラスの理解が一本につながる瞬間です。


using System;
using System.Windows.Forms;

namespace HelloWorld
{
    // Formクラスを継承した画面クラス
    public partial class Form1 : Form
    {
        // Form1が作られたときに実行されるコンストラクタ
        public Form1()
        {
            // デザイナーで配置した画面部品を初期化
            InitializeComponent();

            // MyButtonクラスからボタンを作成
            MyButton myButton = new MyButton();

            // このフォームを親にする(画面に表示される)
            myButton.Parent = this;

            // ボタンに表示する文字
            myButton.Text = "私のボタン";

            // MyButtonで追加された独自プロパティ
            myButton.Category = "カテゴリがつかえたよ!!";

            // ボタンのClickイベントにHelloButtonCliekedメソッドを登録
            // → ボタンが押されるとHelloButtonCliekedが呼ばれる
            myButton.Click += HelloButtonClieked;
        }

        // ボタンがクリックされたときに実行されるイベント処理
        private void HelloButtonClieked(object sender, EventArgs e)
        {
            // ラベルの文字を変更
            helloLabel.Text = "Hello, World!";
        }
    }
}
訪問数 36 回, 今日の訪問数 36回

記事下広告