はじめに
オブジェクト指向とは、作りたいもの (オブジェクト) を、一つ一つの部品に分けて作っていくことです。
クルマ作りにたとえて、 工場内に6つのチームがあるとします。
オブジェクト指向によらないクルマ作りは、6つのチームそれぞれでクルマを完成させます。
オブジェクト指向によるクルマ作りは、
- ボディを作るチーム
- ドアを作るチーム
- エンジンを作るチーム
- ウィンドウを作るチーム
- タイヤを作るチーム
- 上記各部品を合体させるチーム
のように部品ごとにチームを分けてクルマを完成させます。
どちらにもメリット、デメリットはありますが、 Javaはオブジェクト指向型言語といわれるくらいオブジェクト指向と相性がいいので、ここで考え方を身に着けていきましょう!
オブジェクトを理解する上で避けては通れない用語を3つ覚えましょう!
Step1: 概念を知る
わかりやすいようにRPGで考えていきましょう! RPGには、いろんなキャラクターがいます。
どのキャラクターもみんな元々は人間なので「人間クラス」を元に(継承)作られています。
Human.java (人間クラス)
Yusha.java (勇者クラス)
Wizard.java (魔法使いクラス)
Cleric.java(僧侶クラス)
LastBoss.java (ラスボスクラス)
ラスボスとの戦闘シーンを思い描いてください。
メイン処理
プログラムの主処理を記述します。
RPG風のメッセージを表示し、各キャラクターのステータスを表示します。
main.java
【実行結果】
Step2: 使い方を知る
プログラムを解説していきます!
Humanクラス
Humanクラスには身長、体重、体力などRPGのキャラクターのベースとなるプロパティや、 話す talk 食べる eatFood などのメソッドが設定されています。
各プロパティは公開範囲が private なので、 データを参照したり変更したりするには、setNamegetName のような「setter」「getter」 と呼ばれるメソッドを使う必要があります。
消化する digestFood というメソッドもありますが、これは体の内部のことで公開する必要もないため、カプセル化といって処理はするものの、結果を表示させることはしていません。
Yusha、Wizard、 Crelic、 LastBossクラス
extends Human : 継承
ここではHumanクラスを継承することにより、 Humanクラスが持つ人間の基本動作をそのまま利用しています。
必要最低限の「共通する基本情報」 を用意しておくと、 Human クラスの汎用性が高まります。
独自のメソッドの実装
継承した人間の基本動作に加えて、それぞれのキャラクター固有の必殺技や魔法攻撃のメソッドを持っています。
「継承 + 独自のメソッドやプロパティ」 を実装することで、 継承したクラスに付加価値を与えることができます。
コンストラクタによる初期設定
各キャラクターはコンストラクタにより、身長、体重、体力などの初期設定が可能です。
オブジェクトを最初に生成する際に実行されるため、初期設定 * をするのに適しています。
メイン処理
・プログラムの流れ
1: 各キャラクターのオブジェクトを生成
オブジェクトに命が吹き込まれてRPG風の戦闘が始まります。
(new Humanクラスを継承した各クラス
2: 各キャラクターの攻撃メソッドにターゲットを指定
これにより指定したターゲットの体力が減少します。
例) 僧侶(Crelic クラス) の場合
1. 回復メソッドを呼び出す
2. ターゲットの体力が回復する処理
メソッドのターゲットの指定には、 Humanクラスを設定しています。
Humanクラスは全キャラクターが継承しているクラスなので、どのキャラクターでも対象として指定できます。
3: 回復
クラスのメソッドや回復アイテムの使用により、 回復するプロパティや分量が変わるように設計されています。
例) Humanクラスの食べるメソッド eatFood
Humanクラスで設定された消化メソッド digestFood が呼び出され、 回復する仕組みになっています。
Humanクラスの説明でも既出ですが、カプセル化により隠蔽されています。
4: 各キャラクターのステータス
生成した各クラスのオブジェクトごとにプロパティの値は異なります。
また、戦いによるダメージによって各キャラクターのプロパティが変わっているのがわかると思います。
(ここでは 「たいりょく」 がそれにあたりますね
Step3: オブジェクト指向的にキャラクターを作っていない場合の問題点
コードが見づらくなる
Humanクラスを継承せずにYushaクラス、 Wizardクラスなどに毎回Humanメソッドを記述しても結果は変わりません。
しかし、コードが非常に長くなり、見づらいコードとなってしまいます。
機能を増やすときの手間が増える
人気RPGなので大型アップデートとして新しく王宮戦士、王女、神官、商人、踊り子、 裏ボスのキャラクターを追加することになりました。
キャラクターごとにHumanメソッドを記述していた場合、 新しいキャラクターには機能追加とHumanメソッドの記述が必要ですが、オブジェクト指向的に記述していれば機能追加をすれば完了です。
修正漏れが起きやすくなる
人間の基本動作に、宿屋に泊まることで体力、 魔力が全回復する 「寝る」 という機能をつけるのを忘れていました。
キャラクターごとにHumanメソッドを記述していた場合、一個一個に「寝る」というメソッドを記述し修正しなければいけませんが、オブジェクト指向的に記述していればHumanクラスに「寝る」 という
メソッドを一回記述すれば修正完了です。
