ここから本文です

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

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

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

再登録しました。

追加に失敗しました。

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

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

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

追加できませんでした。

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

C# ポリモーフィズム No.2 仮想メソッド <複数のクラスを変数のように切り替える>

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

  • ナイス!:

    14

  • 閲覧数:1970

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

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

C# ポリモーフィズム No.2 仮想メソッド
--- 複数のクラスを変数のように切り替える


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


「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 VirtualMethod
{

    // ************************************************
    // 演算処理基本クラス
    //  各種演算を行うクラス。だだし、各種演算の処理内容は、派生クラスで定義する。
    // ************************************************
    class ArithmeticBase
    {
        public float answer;


        //------------------------
        // 演算メソッド(加算、減算等)
        public virtual float ArithmeticMethod(float x, float y)
        {
            // 処理内容は、派生クラスで定義する。
            return 0.0F;
        }
    }

    // ************************************************
    // 加算クラス
    // ************************************************
    class AddClass : ArithmeticBase
    {
        //------------------------
        // 演算メソッド <加算>
        public override float ArithmeticMethod(float x, float y)
        {
            answer = x + y;
            return answer;
        }
    }

 

    // ************************************************
    // 減算クラス
    // ************************************************
    class SubtracClass : ArithmeticBase
    {
        //------------------------
        // 演算メソッド <減算>
        public override float ArithmeticMethod(float x, float y)
        {
            answer = x - y;
            return answer;
        }
    }

 


    // ************************************************
    // 乗算クラス
    // ************************************************
    class MultiplyClass : ArithmeticBase
    {

        //------------------------
        // 演算メソッド <乗算>
        public override float ArithmeticMethod(float x, float y)
        {
            answer = x * y;
            return answer;
        }
    }

 

    // ************************************************
    // 除算クラス
    // ************************************************
    class DivideClass : ArithmeticBase
    {


        //------------------------
        // 演算メソッド <除算>
        public override float ArithmeticMethod(float x, float y)
        {
            answer = x / y;
            return answer;
        }
    }


}






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 VirtualMethod
{
    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 = "除算";
            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);


            //------------------------
            // 演算種別を選択して、該当演算クラスを演算処理基本クラスに代入
            //------------------------

            ArithmeticBase ArithmeticObj;

            // 加算選択時
            if (radioButton1.Checked == true)
            {
                ArithmeticObj = new VirtualMethod.AddClass();
            }
            // 減算選択時
            else if (radioButton2.Checked == true)
            {
                ArithmeticObj = new VirtualMethod.SubtracClass();
            }
            // 乗算選択時
            else if (radioButton3.Checked == true)
            {
                ArithmeticObj = new VirtualMethod.MultiplyClass();
            }
            // 除算選択時
            else
            {
                ArithmeticObj = new VirtualMethod.DivideClass();
            }


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

            float ans = ArithmeticObj.ArithmeticMethod(data1, data2);

            label1.Text = ans.ToString();

        }
    }
}






実行結果


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




実行画面

 








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

 

まず、切り替えて行く各種クラスを用意します。
そして、その各種クラスは、共通の親クラスから派生させます。
そして、切り替え後に、実行するメソッドに override と言う記述を行ないます。
なお、この override の記述は、派生クラスにおけるメソッドに記述します。
親クラスのほうは、別の記述をします。
それは、後に説明しますので、ここではまず、派生クラスのほうの override の記述方法を説明します。
その記述方法は、以下のようにします。


アクセス修飾子 override 戻り値の型 デリゲート名(引数の型 引数1, 引数の型 引数2, ---)

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


        public override float ArithmeticMethod(float x, float y)
        {
            answer = x + y;
            return answer;
        }

次に、親クラスのほうの該当メソッドにも、上記のような記述を行ないます。
ただし、親クラスの場合は、 override ではなく、 virtual と記述します。
すなわち、以下のようにします。

アクセス修飾子 virtual 戻り値の型 デリゲート名(引数の型 引数1, 引数の型 引数2, ---)

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

        public virtual float ArithmeticMethod(float x, float y)
        {
            // 処理内容は、派生クラスで定義する。
            return 0.0F;
        }

次に、選択したクラスをオブジェクトに収めます。


親クラス名 オブジェクト名 = new 子クラス名();

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

ArithmeticBase ArithmeticObj = new VirtualMethod.AddClass();

次に、オブジェクトに収めたクラスのメソッドを、実際に実行するには、そのまま普通にメソッドを実行するだけです。


戻り値の型 戻り値格納用オブジェクト = 該当クラス用オブジェクト.メソッド名(引数の型 引数1, 引数の型 引数2, ---);

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


float ans = ArithmeticObj.ArithmeticMethod(data1, data2);

 




Yahoo!ブックマークに登録

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

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

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

利用登録ナビへ

感想アドバイス履歴

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

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

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

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

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

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

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

PR

PR

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

グレード

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

知恵袋マスター

abiko_tetuさん男性

ピックアップ

◆TDR◆ どのチケットを買えば...
東京ディズニーランド・シーに入園するには、「パスポート」...
◆TDR◆ 新アトラク・限定イベ...
12/11更新:スプリングヴォヤッジ情報11/30更新:ザ・ダイヤ...
東京駅近辺での早朝の過ごし方
ようこそ、東京へ。  夜行バスなどで、東京に来られる方がい...

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

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

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

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

続けてリクエストする

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

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

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

知恵ノートとは?

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