WinFormsで学ぶオブジェクト指向入門資料

この資料では、WinFormsアプリケーションにおいて「ボタンをクリックするとメッセージボックスを表示する」という機能を実装しながら、オブジェクト指向の基本概念(クラス、インスタンス、継承、カプセル化、イベントとデリゲートなど)を学びます。
実装方法は大きく2通りあり、以下の2パターンで実例を示します。


1. ツールボックス(Visual Studio デザイナー)を使うパターン

手順

  1. 新しいプロジェクトの作成
    Visual Studio を起動し、「新しいプロジェクトの作成」から「Windows Forms アプリケーション(.NET Framework または .NET)」を選択します。
  2. フォームにボタンを配置
    デザイナー画面(Form1.cs [Design])で、ツールボックスから「Button」をドラッグ&ドロップしてフォーム上に配置します。
    プロパティウィンドウでボタンの Name を例えば button1Text を「Click Me」などに設定します。
  3. イベントハンドラの作成
    ボタンをダブルクリックすると、コードビハインドに自動的に Click イベント用のハンドラが生成されます。
  4. コードの実装
    自動生成されたイベントハンドラ内に、以下のようにメッセージボックスを表示するコードを記述します。

サンプルコード(Form1.cs)

using System;
using System.Windows.Forms;

namespace WinFormsDemo_Toolbox
{
    // Form1はSystem.Windows.Forms.Formを継承したクラス(オブジェクト指向の継承の例)
    public partial class Form1 : Form
    {
        public Form1()
        {
            // デザイナーで配置した部品の初期化
            InitializeComponent();
        }

        // ボタンのClickイベントハンドラ(イベント=デリゲートを利用したオブジェクト指向の実装例)
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello, WinForms with Toolbox!");
        }
    }
}

オブジェクト指向のポイント

  • クラスとインスタンス
    • Form1Form クラスを継承しており、フォーム自体が一つのオブジェクト(インスタンス)です。
    • ツールボックスで配置したボタンも内部的には Button クラスのインスタンスとして管理されています。
  • イベント処理
    • ボタンの Click イベントに対して、メソッド button1_Click が登録され、ボタンがクリックされたときに呼び出されます。これはデリゲートを使ったオブジェクト指向の実装例です。
  • 部分クラス
    • Form1 はデザイナーが生成するコードと手動で追加するコードを分離するために partial class として定義されています。これにより、部品の初期化コードとロジックが分離され、保守性が向上します。

2. コードだけで実現するパターン

手順

  1. 新しいプロジェクトの作成
    Visual Studio で「Windows Forms アプリケーション」を作成し、デザイナーを使わずにコードでフォームを生成します。
  2. フォームとボタンをコードで生成
    新たにクラス(例:MainForm)を定義し、System.Windows.Forms.Form を継承します。
    コンストラクタ内で Button のインスタンスを生成し、位置やテキストなどのプロパティを設定、さらにイベントハンドラを登録してフォームのコントロールに追加します。
    ※ イベントハンドラの登録は、従来の
myButton.Click += new EventHandler(MyButton_Click);


と記述する方法もありますが、C# 2.0以降は以下のように簡略化して記述できます。

myButton.Click += MyButton_Click;
  1. プログラムのエントリーポイントからフォームを起動
    Main メソッドでフォームのインスタンスを作成し、Application.Run で実行します。

サンプルコード(Program.cs)

using System;
using System.Windows.Forms;
using System.Drawing; // 位置やサイズの指定に使用

namespace WinFormsDemo_CodeOnly
{
    // MainFormはフォームのカスタムクラス。Buttonなどの部品をコードで生成します。
    public class MainForm : Form
    {
        private Button myButton; // フィールドとしてボタンを定義

        public MainForm()
        {
            // フォームの基本設定
            this.Text = "コードで作成したフォーム";
            this.Size = new Size(300, 200);
            this.StartPosition = FormStartPosition.CenterScreen;

            // Buttonのインスタンスを生成し、プロパティを設定
            myButton = new Button();
            myButton.Text = "Click Me";
            myButton.Size = new Size(100, 40);
            myButton.Location = new Point((this.ClientSize.Width - myButton.Width) / 2, 
                                          (this.ClientSize.Height - myButton.Height) / 2);

            // Clickイベントに対するイベントハンドラを登録(簡略化された記法)
            myButton.Click += MyButton_Click;

            // ボタンをフォームのコントロールに追加
            this.Controls.Add(myButton);
        }

        // ボタンがクリックされたときに呼ばれるイベントハンドラ
        private void MyButton_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello, Code-based WinForms!");
        }
    }

    // アプリケーションのエントリーポイント
    static class Program
    {
        [STAThread]
        static void Main()
        {
            // アプリケーションの初期化
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            // MainFormのインスタンスを生成して実行
            Application.Run(new MainForm());
        }
    }
}

オブジェクト指向のポイント

  • クラス設計とインスタンス生成
    • MainFormForm クラスを継承したカスタムクラスで、フォームの動作や外観を独自に実装しています。
    • myButtonButton クラスのインスタンスであり、MainForm の一部(部品)として管理されています。
  • カプセル化
    • ボタンの生成やイベントハンドラの登録といったロジックが MainForm クラス内にカプセル化されており、フォームの内部状態が守られています。
  • イベント処理の委譲
    • myButton.Click に対して MyButton_Click メソッドをデリゲートとして登録することで、ボタンがクリックされた際の処理をオブジェクト指向的に委譲しています。
  • 再利用性と拡張性
    • クラス設計により、作成したフォームや部品は他のプロジェクトで再利用・拡張が容易になります。

3. ツールボックスとコード実装の比較

観点ツールボックス(デザイナー利用)コードだけで実装
開発のしやすさビジュアルに配置できるため直感的・迅速にレイアウトが作成できる細かなレイアウトや動的生成に柔軟。コードで全て制御可能
自動生成コードInitializeComponent など自動生成コードが分離されるすべて自分で記述するため、動作の全体像が把握しやすい
オブジェクト指向の理解デザイナーの裏側でオブジェクトがどのように管理されているか体感できるクラス生成、イベント登録などを自ら実装することで、理解が深まる

4. まとめ:オブジェクト指向とWinForms開発

  • 継承
    • WinFormsでは FormButton など、多くのクラスが用意され、これらを継承してカスタムクラスを作成することで既存の機能を拡張・再利用できます。
  • カプセル化
    • 各フォームやコントロールは内部状態や動作(プロパティ、メソッド、イベント)を持ち、必要な部分のみ外部に公開します。
  • イベントとデリゲート
    • ユーザー操作(ボタンクリックなど)に対して、オブジェクト指向的にイベントをハンドリングする仕組みは、実世界の「通知」や「処理の委譲」をコード上で表現しています。
  • 再利用性と拡張性
    • クラス設計により、作成したフォームや部品は他のプロジェクトや新たな機能拡張にそのまま利用することが可能です。

WinFormsでの開発を通して、オブジェクト指向の基本概念を実践的に理解することができます。
ツールボックスを使った方法は直感的で迅速にレイアウトが作成できる一方、コードで実装する方法は細部まで自分で制御できるため、より深い理解が得られます。
どちらの方法もそれぞれメリットがあるので、両方の手法を経験し、オブジェクト指向プログラミングの理解を深めてください。