この知恵ノートを「知恵コレクション」に追加しました。
追加した知恵ノートはMy知恵袋の「知恵コレクション」ページで確認できます。
「知恵コレクション」に登録済みです。
再登録しました。
追加に失敗しました。
ノートに戻り、もう一度やり直してください。
すでに1,000件のノートが登録されています。
新しく追加したい場合は、My知恵袋の「知恵コレクション」ページで登録されているノートを削除してください。
追加できませんでした。
ノートは削除されました。
知恵コレに追加する:0人
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);
アドバイス(このノートのライターへのメッセージ)を送る
このノートはどうでしたか? いいと思ったことや、こうしたらもっとよくなるといったメッセージを送りましょう! ノートの内容やライターについて質問がある場合は、Q&Aから質問してみましょう
アドバイスを送るには、
Yahoo! JAPAN IDでのログインおよび
Yahoo!知恵袋の利用登録が必要です。
感想アドバイス履歴
-
現在アドバイスはありません
このノートに関するQ&A
このノートに関するQ&Aは、まだありません。