ポリモーフィズム(多様性)とは、同じようなものを同じように操作できる機能のことです。
もう少し言うと、同じようなオブジェクトを「同じ種類のものたち」という視点で考えて、共通の操作方法で扱うことです。
Javaでは、ある親クラスから継承して作った複数の子クラスはみんな、親クラスの性質を受け継いだ「同じ種類のものたち」と考えることもできます。メソッドの中身は違うけど、同じように扱えるというわけです。
たとえオーバーライド(上書き)されたとしても、「同じようなことを、それぞれに適した方法で実現しようとしているだけ」なので「同じ命令」と考えることができます。
さらに、子クラスのインスタンスを入れる変数や配列のデータ型を工夫すると、効率よく操作することができます。
CalcQuizクラス(親クラス) | MushikuiQuizクラス(子クラス) | MistakeQuizクラス(子クラス) |
createQuestion()、getQuestion()、getAnswer() | createQuestion()、getQuestion()、getAnswer() | createQuestion()、getQuestion()、getAnswer() |
上記の表は「計算問題を作るクラス」を継承して、「虫食い探しクイズ」「間違い探しクイズ」を作ったときのメソッドです。同じ種類のクラスであり、同じメソッドで操作できます。そしてCalcQuizという親クラスのデータ型の配列を作れば、子クラスたちのインスタンスを入れることができます。そしてfor文などでまとめて操作が出来るようになります。
「たぬき言葉クイズ」を作ってみよう
たぬきクイズってご存じですか?「た」ぬきクイズであり、文字列から「た」を抜いて、正しい言葉に直すクイズです。例えは、「たおはよたたう」という文字列があれば、ここから「た」だけ抜いて、「おはよう」という言葉になります。こういったクイズを作ってみましょう。
また、以前作った「虫食いクイズ」「間違い探しクイズ」「たぬき言葉クイズ」をポリモーフィズムを活用しランダムに出すようにしてみましょう。
TanukiQuiz.java
import java.util.Random; class TanukiQuiz extends CalcQuiz { TanukiQuiz(){ createQuestion(); } | ランダムをインポートし、たぬき言葉クイズを作る クラスを作ります。また、ポリモーフィズムを活用してコンストラクタを作ります。 |
void createQuestion(){ String [ ] answerWord = {“おやすみ”,”楽しい”,”おもしろい”}; | 問題を1つ作るメソッドを作り、問題にする文字を配列について作ります。 |
Random rnd = new Random(); int qID = rnd.nextInt(answerWord.length); this.question = answerWord[qID]; | 何番目を問題にするかを変数pIDに代入します。 |
for(int i = 0; i < 3; i++){ int cPos = rnd.nextInt(question.length()); | 問題数を3つ表示させる |
String firstHalf = this.question.substring(0,cPos); String secondHalf = this.question.substring(cPos); this.question = firstHalf + “た” + secondHalf; } | 文字列のsubstring()を使うと、文字列を切り分けることができます。ランダムな位置で2つに分け、間に「た」を入れます。 |
this.question += “:このたぬき言葉を読んでください”; this.answer = “「た」を抜くと、” + answerWord[qID]; } } | 問題の文字列と答えの文字列を表示させる |
Main.java
import java.util.Random; public class Main { public static void main(String[] args) throws Exception { Random rnd = new Random(); | ランダムをインポートし、最初に実行する クラスを作ります。 |
int quizNum = 4; CalcQuiz [ ]quiz = new CalcQuiz[quizNum]; | 問題数を変数quizNumに代入する。 また問題を作るインスタンスを入れる配列 を作る |
for(int i =1; i < quizNum; i++){ int qID = rnd.nextInt(3); | 4未満なので、1~3の3つの問題を繰り返す。 0から3のランダムな数を出すを変数qIDに代入する |
if(qID == 0){ quiz[i] = new MushikuiQuiz(); } | ゼロのときは、虫食いクイズを表示 |
else if (qID == 1){ quiz[i] = new MistakeQuiz(); } | 1のときは間違い探しクイズを表示 |
else { quiz[i] = new TanukiQuiz(); } } | それ以外はたぬき言葉クイズを表示 |
for(int i =1; i < quizNum; i++){ System.out.println(“問” + i + “:” + quiz[i].getQuestion()); } | ポリモーフィズムを活用してすべての問題を表示する |
System.out.println(“~~~~~~~”); for(int i = 1; i < quizNum; i++){ System.out.println(“答え” + i + “:” + quiz[i].getAnswer()); } } } | ポリモーフィズムを活用してすべての答えを表示する |
実行をクリックするたびにランダムに各種の問題が出されるようになりました。
ポリモーフィズムを活用してランダムに問題を出しているのがわかりましたでしょうか。