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

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

このブログではAffinger5を使用しています。

ブログテーマが気に入った方はコチラをクリック

今回のテーマ

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

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

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

サルモリ
早速クラスを作ってみるよ!

サルモリはロボットクラスを作りました。

サルモリは早速いつも良く使用しているロボットクラスに攻撃メソッドを追加しました。

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

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

サルモリ
早速動かしてみるよ!

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

 出力結果
Rockman
チャージショット
Fireman
ファイヤーストーム
Iceman
アイススラッシャー
サルモリ
ちゃんと動いたよ!

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

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

サルモリはファイヤーマンの攻撃の場合は出力を2つにアイスマンの場合は出力を4つに分けたいと考えました。

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

ロックマンの攻撃

ファイヤーマンの攻撃

アイスマンの攻撃

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

サルモリ
どうしよう!

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

抽象クラスの実装

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

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

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

抽象クラスの継承

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

サルモリ
3つのクラスを作るよ!

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

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

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

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

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

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

サルモリは早速下記のコードで正しく動作するか確認してみました。

 command
Rockman
チャージショット
Fireman
ファイヤー
ストーム
Iceman
ア
イ
ス
クラッシャー
サルモリ
ちゃんと動いたよ!!

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

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

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

サルモリ
Mainの処理が恐ろしいことになってるよ!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

サルモリ
最後まで読んでくれてありがとう!

 

 

 

C#のLinqをさらに学びたい方へ

C#のLinqを理解して頂くために参考書を執筆致しました!

Linqの演習問題はこちらの参考書に載せているので、問題を解いて理解を深めたい方はこちらの参考書チェックしてください!

下記の画像をクリック!!kindleunlimitedの会員であれば無料で見れます!

⇩初心者向け      ⇩中級者向け

C#でChatGPTAPIを使ってブログ作成を自動化しませんか?

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

Ads Blocker Image Powered by Code Help Pro

広告ブロックを検出しました。

ブラウザの広告機能を使用して広告をブロックしていることが検出されました。
ブラウザの広告ブロッカーを無効にし、「更新」をクリックしてください。

Powered By
Best Wordpress Adblock Detecting Plugin | CHP Adblock