オブジェクト指向 配列、リスト

C# オブジェクト指向のポリモーフィズムと抽象クラスについて学ぼう ロックマンを例にしてポリモーフィズムを解説します。

今回のテーマ

こんにちは、かっぱちゃんです。今回はオブジェクト指向のポリモーフィズムについて解説します。

今回の記事はかっぱちゃんと一緒に学ぶ形にしていきたいと思います。オブジェクト指向のシリーズはかっぱちゃんと学んでいく感じにしますかね。

では、やっていきましょう!!

KappaChan
早速クラスを作ってみるかっぱ!

かっぱちゃんはロボットクラスを作りました。

かっぱちゃんは早速いつも良く使用しているロボットクラスに攻撃メソッドを追加しました。

そのクラスが下記のクラスです。

Attackメソッドを追加しています。

KappaChan
早速動かしてみるかっぱ!

下記のソースコードで正しく動作するか確認してみました。

 出力結果
Rockman
チャージショット
Fireman
ファイヤーストーム
Iceman
アイススラッシャー
KappaChan
ちゃんと動いたかっぱ!

ロボットの攻撃を別の処理にしたい

正しく動きましたが、一つ問題が発生します。

かっぱちゃんはファイヤーマンの攻撃の場合は出力を2つにアイスマンの場合は出力を4つに分けたいと考えました。

各ロボットの処理はこのような感じにしたいです。

ロックマンの攻撃

ファイヤーマンの攻撃

アイスマンの攻撃

上記のような処理にするには、ロボットクラスだけでは出来ません。

KappaChan
どうしようかっぱ!

そこで使用するのが抽象クラスです!!

抽象クラスの実装

早速、抽象クラスを作ってみましょう。攻撃のみ抽象メソッドにしています。

抽象クラスや抽象メソッドにするには、「abstract」を付け加えてあげましょう。

続けて、この作った抽象クラスを継承したクラスを作ります。

抽象クラスの継承

ロボット抽象クラスを継承したロックマンクラス、ファイヤーマンクラス、アイスマンクラスを作りました。

KappaChan
3つのクラスを作るかっぱ!

下記にソースコードを書きます。抽象メソッドとなっているAttackメソッドのみそれぞれの処理を記述しています。

このソースコードのポイントは下記の4つです。

クラスの継承方法は「クラス : 親クラス」で可能です。

コンストラクタのbaseで親クラスのコンストラクタの処理を行っています。

継承した子クラスは親クラスの引数を使用することが出来ます。

親クラスにある抽象メソッドは必ず子クラスで実装しなければなりません。

かっぱちゃんは早速下記のコードで正しく動作するか確認してみました。

 command
Rockman
チャージショット
Fireman
ファイヤー
ストーム
Iceman
ア
イ
ス
クラッシャー
KappaChan
ちゃんと動いたかっぱ!!

今回のように実装することで何がうれしいか?

今回のように各ロボットクラスを作り、実装すると呼び出し元のプログラムを変更せずに実装できます。

抽象クラス使用して各ロボットクラスを作らずにロボットクラスのみの場合は下記のようなコードになります。

KappaChan
Mainの処理が恐ろしいことになってるかっぱ!

この処理に対し、例えばクイックマンを追加したい場合、Mainメソッドにif文の条件をさらに追加しなければなりません。

今回の少ない処理のみであれば、いいのですが大きなシステムになるほど段々と収集がつかなくなっていきます。

ソースコードを書く人が全く別の人だとしたら、If文の内容が永久的に増えていきます。恐ろしいですね。

そこで初めに紹介したオブジェクト指向やポリモーフィズムを使用したソースコードにしておけば、

これから何回も修正やロボットが追加となった場合も分かりやすくソースコードの修正が行えるわけです。

因みにクイックマンを追加した場合下記のような処理となります。

 出力結果
Rockman
チャージショット
Fireman
ファイヤー
ストーム
Iceman
ア
イ
ス
クラッシャー
Quickman
クイックブーメラン

クイックマンを簡単に追加することができました。

このように実装しておけば、ロボットの追加だけでなく、削除や名前の変更なども簡単に行えます。

今回使用した技術用語についてまとめ

今回使用したオブジェクト指向の用語をおさらいしていきます。

ポリモーフィズム:今回実装したソースコードでは、Mainメソッドで呼び出したAttackメソッドの部分を表します。Mainメソッドでは、Attackメソッドを呼びだしているだけだが、各ロボットで動作が切り替わっています。このことをポリモーフィズムと言います。

抽象クラス:abstractを指定したクラスです。抽象メソッドであえて処理を書かずに子クラスに具体的な処理を書かせることでポリモーフィズムなどを実装することが可能となります。

継承クラス:親クラスで継承できることを覚えよう!

今回の記事は長くなりましたが、オブジェクト指向のポリモーフィズムについて解説しました。

正直に言いますと、今回の例ならC#のラムダ式を使用すればMainクラスにif文を追加しなくても実装することは可能です。

C#をやるならラムダ式を使う方法も選択肢として覚えておいた方が良いと思うので別に記事を書いていきたいと思います。

今回は長くなりましたが、最後まで見て頂き有難うございました。

何回も読み返せば、ポリモーフィズムについて学べると思うので何回もチャレンジしてください。

KappaChan
最後まで読んでくれてありがとうかっぱ!

 

 

 

-オブジェクト指向, 配列、リスト

X