これから「構造化」から「オブジェクト指向」へ進むあなたへ
構造化で覚えた「処理の順番」を、オブジェクト指向では「モノ同士のやり取り」へと置き換える――その最初の一歩を示します。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. プロジェクトを作るまで(スクリーンショットの確認)
- テンプレート選択
「Windows フォーム アプリケーション(.NET Framework)」 を選ぶことで、“ウィンドウ=Form クラス” が中心の OOP プロジェクトが自動生成されます。

- 名前を付ける
ClassSample というプロジェクト/ソリューション名を入れるだけで、Visual Studio がフォルダー構成と基本コードを用意します。→ ここまでにコードを書いた覚えはなくても、すでに 「クラス = Form1」 が生成されているのがポイントです。

- デザイン画面が表示されます
右クリックして、コードの表示を選択

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つの追加課題
- ボタンを2個作り、それぞれ違うメッセージボックスを出す→ 同じ Button クラスでも“状態”と“動作”を変えられることを体感できます。
- 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 行で書ける省略形」としてラムダ式に触れると理解がスムーズです。
- → イベント=デリゲート の仕組みを一歩だけのぞき見しましょう。
7. まとめ
- クラスは“モノ”の設計図。今回は「Form=窓」「Button=部品」という GUI オブジェクトを扱った。
- コンストラクタで“生まれた直後”の初期化を行い、必要な子オブジェクトを生成して組み合わせる。
- イベント駆動は「オブジェクトが自分で反応する」仕組みであり、構造化の switch より自然に拡張できる。
「手続きの順番を考える」から 「モノの責任と関係を設計する」 へ――
これが構造化 → オブジェクト指向への一番大きなジャンプです。
サンプルを動かしながら、“自分で new したオブジェクトに何を任せるか” を意識してみてください。
訪問数 52 回, 今日の訪問数 1回
ディスカッション
コメント一覧
まだ、コメントがありません