ここから本文です

この知恵ノートを「知恵コレクション」に追加しました。

追加した知恵ノートはMy知恵袋の「知恵コレクション」ページで確認できます。

知恵コレクション」に登録済みです。

再登録しました。

追加に失敗しました。

ノートに戻り、もう一度やり直してください。

すでに1,000件のノートが登録されています。

新しく追加したい場合は、My知恵袋の「知恵コレクション」ページで登録されているノートを削除してください。

追加できませんでした。

ノートは削除されました。

C# ポリモーフィズム No.1 デリゲート <複数のメソッドを変数のように切り替える>

ライターabiko_tetuさん(最終更新日時:2012/11/5)投稿日:2012/1/29 アドバイス受付中!

  • ナイス!:

    15

  • 閲覧数:2037

印刷用のページを表示する

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

C# ポリモーフィズム No.1 デリゲート
--- 複数のメソッドを変数のように切り替える


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*


「C#で ポリモーフィズム」における一連の説明(知恵ノート)において、ここでは、「デリゲート <複数のメソッドを変数のように切り替える>」について説明します。






総合の目次


本ページを含めた関連事項の総合目次です。


http://note.chiebukuro.yahoo.co.jp/detail/n54379






はじめに


変数は、値が異なる個々のケースに対応が可能になるので、便利であることは、プログラマーなら誰でもよく知っている事だと思います。
同じように、動作定義も個々のケースに応じて切り替えられたら便利です。
それはデリゲートと言う機能で実現が可能です。
すなわち、複数のメソッドを用意しておいて、デリゲートと言う機能で切り替えていくことが可能です。






他の関連サンプルと比べた特徴


本サンプルでは、複数のメソッドを用意しておいて、それらの中から、状況に合ったメソッドに切り替えます。
すなわち、メソッドの内容を、まるで変数のように切り替えます。
同じように、複数のクラスを切り替える手法もあります。
そのクラス単位で切り替える方法は、別の機会(関連サンプル)で紹介します。
ここでは、メソッド単位で切り替える手法について解説します。





サンプルコード


ここで取り上げるサンプルは、なるべく複雑にならない範囲で、実際にデリゲートを確かめられるものとします。






本サンプの仕様


本サンプルでは、デリゲートの基本的なコードの書き方を紹介することが目的なので、単純な計算を行なうだけにしました。
具体的には、足し算、引き算、掛け算、割り算の各種計算用メソッドを、デリゲートで切り替えるようにしています。

操作の手順としては、テキストボックス1に演算値1(例えば7+12ならば、その7)を入力する。
テキストボックス2に演算値2(例えば7+12ならば、その12)を入力する。
加算、減算、乗算、除算の選択を4個のラジオボタンから選択する。
これらの入力と選択を終えたら、ボタンをクリックします。
そうすると、計算結果がラベルに表示されます。





フォームデザイン等の前準備


コードを記述する前に、フォームのデザイン作成などの、以下の前準備を行なって下さい。

<プロジェクトの作成>
本サンプルの確認用に、新規にプロジェクトを作成して下さい。
プロジェクトの種類は、「Windowsフォームアプリケーション」です。


<フォームのデザイン>
デザイン画面で、TextBox (テキストボックス) を2個と、RadioButton(ラジオボタン) を4個と、Label(ラベル) を1個と、 Button (ボタン)を1個貼り付けて下さい。
なお、GroupBox(グループボックス)を貼り付けて、その上に各ラジオボタンを貼り付けても構いません(ラジオボタンの群は、ひとグループだけなので、グループボックスは、有っても無くても構いません)。



デザイン画面

 


 


<イベントプロシージャの作成>

デザイン画面のフォーム(無地の部分)をダブルクリックして、Form1_Load() メソッド を作って下さい。
また、先程貼り付けたデザイン画面上のボタン「button1」をダブルクリックして、button1_Click() メソッド を作って下さい。


<クラスを書くためのソースファイルの作成>

[プロジェクト] - [クラスの追加] で、「新しい項目の追加」画面を表示する。
その画面の [ファイル名]欄に任意のファイル名(クラス用ソースファイルのファイル名)を記入する。
[追加]ボタンをクリックする。

なお、ここで作成されたソースファイルには、後述しますクラスのコード(「演算処理クラスのコード)を記述します。





演算処理クラスのコード



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateSample
{

    // ************************************************
    // 演算処理クラス
    //  各種演算メソッドと、そのデリゲートをまとめたクラス
    // ************************************************
    class ArithmeticClass
    {


        //------------------------
        // 加算メソッド
        public static float AddMethod(float x, float y)
        {
            return x + y;
        }

        //------------------------
        // 減算メソッド
        public static float SubtracMethod(float x, float y)
        {
            return x - y;
        }

        //------------------------
        // 乗算メソッド
        public static float MultiplyMethod(float x, float y)
        {
            return x * y;
        }

        //------------------------
        // 除算メソッド
        public static float DivideMethod(float x, float y)
        {
            return x / y;
        }

 

        //------------------------
        // 演算メソッド用デリゲート
        public delegate float ArithmeticMethodDelegate(float x, float y);

    }
}






Formクラスのコード



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DelegateSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

 

        //============
        // フォーム起動時のイベントプロシージャ
        private void Form1_Load(object sender, EventArgs e)
        {
            //------------------------
            // 各種コントロールの初期設定
            //------------------------

            button1.Text = "計算";
            groupBox1.Text = "演算種別を選択";
            radioButton1.Text = "加算";
            radioButton2.Text = "減算";
            radioButton3.Text = "乗算";
            radioButton4.Text = "除算";
            radioButton1.Checked = true;    // ラジオボタン1 をON で初期化

            textBox1.Text = "0.0";
            textBox2.Text = "0.0";
            label1.Text = "0.0";
        }

 

        //============
        // 計算ボタン
        private void button1_Click(object sender, EventArgs e)
        {
            //------------------------
   // 演算値 文字列 ---> 数値 変換
            //------------------------

            float data1;
            Single.TryParse(textBox1.Text, out data1);
   float data2;
            Single.TryParse(textBox2.Text, out data2);


            //------------------------
            // デリゲートを用いて演算種別を選択
            //------------------------

            ArithmeticClass.ArithmeticMethodDelegate ArithmeticDelegate;

            // 加算選択時
            if (radioButton1.Checked == true)
            {
                ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.AddMethod);
            }
            // 減算選択時
            else if (radioButton2.Checked == true)
            {
                ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.SubtracMethod);
            }
            // 乗算選択時
            else if (radioButton3.Checked == true)
            {
                ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.MultiplyMethod);
            }
            // 除算選択時
            else
            {
                ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.DivideMethod);
            }


            //------------------------
            // 演算処理実行
            //------------------------

            float ans = ArithmeticDelegate(data1, data2);

            label1.Text = ans.ToString();

        }
    }
}





実行結果


計算結果が表示されます。


実行画面





解説(コードを書くポイント)


まず、切り替えて行く各種メソッドを、どのような引数の並びによるメソッドにするのか、それを宣言します。
その宣言は、以下のようにします。


delegate 戻り値の型 デリゲート名(引数の型 引数1, 引数の型 引数2, ---);


前述のサンプルの場合は、以下のようになっています。


delegate float ArithmeticMethodDelegate(float x, float y);


次に、選択したメソッドをオブジェクトに収めます。


デリゲート名 オブジェクト名 = new デリゲート名(メソッド名);


前述のサンプルの場合は、以下のようになっています。


ArithmeticClass.ArithmeticMethodDelegate ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.AddMethod);


次に、オブジェクトに収めたメソッドを、実際に実行するには、オブジェクト名をメソッド名のように扱って、普通にメソッドを実行するだけです。


戻り値の型 戻り値格納用オブジェクト = デリゲート用オブジェクト名(引数の型 引数1, 引数の型 引数2, ---);


前述のサンプルの場合は、以下のようになっています。


float ans = ArithmeticDelegate(data1, data2);

 

Yahoo!ブックマークに登録

アドバイス(このノートのライターへのメッセージ)を送る

このノートはどうでしたか?  いいと思ったことや、こうしたらもっとよくなるといったメッセージを送りましょう! ノートの内容やライターについて質問がある場合は、Q&Aから質問してみましょう

アドバイスを送るには、
Yahoo! JAPAN IDでのログインおよび
Yahoo!知恵袋の利用登録が必要です。

利用登録ナビへ

感想アドバイス履歴

  • 現在アドバイスはありません

このノートに関するQ&A

このノートに関するQ&Aは、まだありません。

このノートについて質問する

このノートについてライターの方に質問できます。

※ライターの方から必ず回答をいただけるとは限りません

※別ウィンドウで開きます

PR

PR

この知恵ノートのライター

グレード

グレード知恵ノートのグレード:2-3

知恵袋マスター

abiko_tetuさん男性

ピックアップ

お尻や足の贅肉にさよなら、本...
本にできない「正しい」下半身ダイエットなぜ「本にできない...
西武鉄道を走る車両part2+横瀬...
【新着】(12/9)西武新101系・301系(ワンマン未対応)が西武...
子供とカブト・クワガタを捕ま...
夏になったら、子供たちとカブト・クワガタを捕まえたいと思...

こんなノートがほしい! リクエストする

最大文字数100文字入力できます

リクエストが送信されました。

いただいたリクエストは、Yahoo!知恵袋スタッフが確認のうえ、ライターの方向けに書いていただきたいテーマとして掲出いたします。

続けてリクエストする

リクエストされている知恵ノートを書く

いま求められているのは、こんな「知恵」。お題をクリックして投稿してみましょう!

知恵ノートを書いてみませんか?知恵ノートの書き方はこちら

知恵ノートとは?

役立つ知恵情報は、Yahoo!知恵袋公式Twitter@yahoochiebukuroをフォロー
本文はここまでです このページの先頭へ