これから「構造化」から「オブジェクト指向」へ進むあなたへ

構造化で覚えた「処理の順番」を、オブジェクト指向では「モノ同士のやり取り」へと置き換える――その最初の一歩を示します。Windows Forms の Form1 クラスを題材に、“new → 設定 → 登録”の基本三拍子で OOP の感覚をつかんでみましょう

Windows Forms サンプル (Form1 クラス) を題材に

1. なぜ“クラス”が要るのか ―― 構造化との対比

視点構造化プログラミングオブジェクト指向
主役関数:メソッド(=処理の手順)クラス(=“モノ”の設計図)
情報の束ね方データと手続きを分けて管理データと手続きを同じ箱にまとめる
拡張・変更関数を増やすと全体が複雑化クラス単位で機能を追加・差し替えやすい
DrawCircle() と MoveCircle() が別々に存在class Circle が 位置半径描画メソッドも丸ごと保持

Buttonクラスの場合(Windows Forms に含まれる .NET の標準ボタンコントロール)

視点構造化プログラミングオブジェクト指向
主役関数:メソッド—CreateButton()/DrawButton()/HandleClick() といった手続きクラス—Button が外観・状態・クリック時の振る舞いをひとまとめ
情報の束ね方ボタンの位置やサイズをグローバル変数に、描画やクリック処理を別々の関数に分離Button インスタンスが 座標・サイズ・テキスト と 描画・クリック処理 を自己完結的に保持
拡張・変更新しいボタンごとに変数と関数を追加 → コード量が散在Button を継承して IconButton などを作れば、既存ロジックに影響せず機能拡張
DrawButton(btnX, btnY, width, height, label) と OnButtonClick(id) がバラバラに存在var btn = new Button { Location = …, Size = …, Text = … }; btn.Click += OnClick;

構造化で学んだ「手続きの流れ」は、OOP では“モノ同士のやり取り”に置き換わると捉えるとスムーズです。


2. プロジェクトを作るまで(スクリーンショットの確認)

  1. テンプレート選択
    「Windows フォーム アプリケーション(.NET Framework)」 を選ぶことで、“ウィンドウ=Form クラス” が中心の OOP プロジェクトが自動生成されます。
  1. 名前を付ける
    ClassSample というプロジェクト/ソリューション名を入れるだけで、Visual Studio がフォルダー構成と基本コードを用意します。→ ここまでにコードを書いた覚えはなくても、すでに 「クラス = Form1」 が生成されているのがポイントです。
  1. デザイン画面が表示されます
    右クリックして、コードの表示を選択

3. Form1 クラスを読み解く

次のソースコードを見て、必要なところを追加します

namespace ClassSample
{
    // GUI の“窓”を表すクラス。Form 基底クラスを継承している
    public partial class Form1 : Form
    {
        public Form1()   // ← コンストラクタ(生成直後に呼ばれる)
        {
            InitializeComponent();   // デザイナが自動生成した初期化

            Button button1 = new Button();     // ★ ① オブジェクトを new
            button1.Text = "Click Me";         // ★ ② 状態(プロパティ)を設定
            button1.Location = new Point(50, 50);
            Controls.Add(button1);             // ★ ③ 自分(Form)に乗せる=合成
        }
    }
}
OOP キーワード意味
public partial class Form1 : Form継承既にある Form 機能を“もらって”拡張
Form1()コンストラクタインスタンス化された直後の初期化手続き
new Button()インスタンス化設計図(Button)から“実体”を作る
button1.Text = …カプセル化データ(文字列)を“ボタンという箱”に閉じ込める
Controls.Add(button1)オブジェクト間協調“親フォームが子コントロールを持つ”関係を構築

4. 実行して確認します

実行結果

ここでの学び

「〇〇を new して、設定して、登録する」―― これが OOP の基本三拍子

すべて「モノ(オブジェクト)の目線」でコードが組み立てられています。


4. 構造化思考から OOP 思考への置き換え図

構造化での発想OOP での対応
CreateButton() という関数を呼んで配置ボタン自身を new して、自分の配置を決める
グローバル変数で座標や文字列を保持プロパティ (Location, Text) として保持
UI 要素ごとに ID を設けて switch で判定イベント (Click など) をボタン自身が持つ

5. “イベント駆動”は OOP の必須パート

構造化では「メインループ→分岐」と書いていた処理が、Windows Forms では OS が“ボタンが押された”というイベントを発火 → ボタンが用意したハンドラーが呼ばれるというスタイルに変わります。

これは 「各オブジェクトが自分の責任で振る舞う」 という OOP の考え方そのものです。


6. まず体験してみよう ―― 2つの追加課題

  1. ボタンを2個作り、それぞれ違うメッセージボックスを出す→ 同じ Button クラスでも“状態”と“動作”を変えられることを体感できます。
  2. Click イベントにラムダ式でハンドラーを追加
button1.Click += (_, __) => MessageBox.Show("Hello!");

「button1.Click += (_, __) => MessageBox.Show(“Hello!");」を一つひとつ分解すると

位置構成要素意味初学者向けコメント
button1オブジェクト画面に置いた Button コントロールのインスタンス「誰がクリックされたか」を表す主語
.ドット演算子オブジェクトのメンバー(プロパティ/メソッド/イベント)にアクセスC# では「ボタンの~」と続ける記号
Clickイベントボタンがクリックされた瞬間に発生する通知「~が起こったよ」と教えてくれる仕組み
+=イベント購読(追加)演算子「このイベントが起きたら、これも一緒に実行してね」と登録する+ は“足す”、= は“代入”のイメージ
(_, __)ラムダ式の引数(object sender, EventArgs e) を 2 つの捨て変数 _ と __ で省略使わないなら「名前は不要」と示す記号
=>ラムダ演算子「~したら → これを実行」の矢印メソッドを 1 行で“その場定義”
MessageBox.Show(“Hello!");本体(ステートメント)「Hello!」というダイアログを表示クリック時に実際に行う処理

同じことを“オーソドックス”に書くとこうなる

// ❶ まずイベント処理用メソッドを用意
private void Button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("Hello!");
}

// ❷ Form1 のコンストラクターなどでイベントに登録
public Form1()
{
    InitializeComponent();
    button1.Click += Button1_Click;   // += で「呼び出してね」と追加
}
ポイントラムダ式版メソッド版
可読性処理が短いときに 1 行で済んでスッキリ複数行になっても読みやすく保守しやすい
変数の使い方引数を使わなければ _, __ で捨ててよいsender, e に正式な型が付く
共通処理1 箇所でしか使わない一発イベント向き複数ボタンから呼びたいときに再利用しやすい

まとめ

  • += は「イベントが発生したら追加した処理も呼ぶ」という合図。
  • ラムダ式((_, __) => …) は「短い処理をその場で書きたい」場面に便利。
  • 初学者のうちは メソッドを分ける書き方 を先にマスターし、あとで「1 行で書ける省略形」としてラムダ式に触れると理解がスムーズです。
  1. → イベント=デリゲート の仕組みを一歩だけのぞき見しましょう。

7. まとめ

  • クラスは“モノ”の設計図。今回は「Form=窓」「Button=部品」という GUI オブジェクトを扱った。
  • コンストラクタで“生まれた直後”の初期化を行い、必要な子オブジェクトを生成して組み合わせる。
  • イベント駆動は「オブジェクトが自分で反応する」仕組みであり、構造化の switch より自然に拡張できる。

「手続きの順番を考える」から 「モノの責任と関係を設計する」 へ――

これが構造化 → オブジェクト指向への一番大きなジャンプです。

サンプルを動かしながら、“自分で new したオブジェクトに何を任せるか” を意識してみてください。

訪問数 52 回, 今日の訪問数 9回

C#

Posted by hidepon