イントロダクション
初めに、メインメソッドを整理して、オブジェクト指向プログラミングの準備を行いました。そして、次にインターフェースの使い方について記載と実装を行いました。
<早い話>
クラスを使用して、役割分担をしたいけど。。。処理がごちゃ混ぜになっていると分担しづらいので整理して、どこでどんな処理をしているかわかりやすくしました。
インターフェースを使う
今回からは、1クラス1機能の形で実装していきたいと思います。
なので、複数クラスを使用していきますので、あっちこっち飛ぶことになります。
まずはメインメソッドのクラスを作成します。名前は「Lv3_1_RefactorLv2_Main」にします。
そして、今までやってきたものとほぼ同じものを作成します。
<実装内容>
- 標準入力からコマンドを実行する
- 「hello」コマンドで「Hello World」をコンソールに表示
- 「ready」コマンドで「Ready?」をコンソールに表示
- 1クラス1機能
上記のような形で実装します。
<実装するクラス>
・Lv3_1_RefactorLv2_Main「処理フローを作る」
・CommandIF「コマンドを作る」
・HelloCommand「helloコマンド」
・ReadyCommand「readyコマンド」
上記の4クラスを作成します。
ここで、インターフェースの使い方を復習します。以前記載したインターフェースの使い方も参照ください、
ちなみに、インターフェースの作り方(Eclipseでの作成方法)に関しては下の動画を参照ください。
インターフェースの使い方
インターフェースは、実装部分のないメソッドの宣言のみが実装されているクラスのことです。具体的には下のようなコードになります。
/**
* コマンドインターフェース<br/>
* インターフェースは、処理内容を書きません。
*
* @author takunoji
* 2019/08/23
*/
public interface CommandIF {
/** コマンドを実行する */
public void execute();
}
インターフェースクラスの名前は「CommandIF」で実行するメソッドは「execute()」です。このインターフェースを実装(Implements)するクラスは「execute()」メソッドを実装する義務が生じます。つまり実装しないとビルドエラーになります。
public class HelloCommand implements CommandIF {
/* (non-Javadoc)
* @see jp.zenryoku.sample.lv3.refactor.CommandIF#execute()
*/
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("Hello World!");
}
}
オーバーライド
ちなみに「@Override」はオーバーライド、メソッドのオーバーライドのことを意味しています。オーバーライドの使い方は大雑把に2種類あります。
<パターン1: Interfaceのオーバーライド>
上のコードそのままです。
<パターン2: 実装されているものをオーバーライド>
Javaでの自作クラスを含む全てのクラスは「Objectクラス」を親クラスに持ちます。親クラスのことを「スーパークラス」と呼び、こちらが世界でも通用する言い方になります。具体的には、以下のようなクラスを作成したとします。
public class ReadyCommand /* implements CommandIF */ {
/* (non-Javadoc)
* @see jp.zenryoku.sample.lv3.refactor.CommandIF#execute()
*/
/* @Override */
public void execute() {
// TODO Auto-generated method stub
System.out.println("Ready?");
}
}
本当は、CommandIFを実装しているクラスなのですが、説明のため。。。
オーバーライド2
このクラスは「スーパークラス」(super class)にObjectクラスを持っています。なので、Objectクラスのメソッドも使用することができます。その証拠にEclipseなどのIDEを使用してコードアシスト機能などで使用できるメソッドが選択できることがありますが、これはObjectクラスのメソッドです。(下のイメージ参照)
そして、この「equals()」メソッドをオーバーライドすると下のような実装になります。
public class ReadyCommand implements CommandIF {
/* (non-Javadoc)
* @see jp.zenryoku.sample.lv3.refactor.CommandIF#execute()
*/
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("Ready?");
}
@Override
public boolean equals(Object cls) {
return true;
}
}
クラスの継承
下の図はクラス図で表現したときの継承を表す図です。「extends Parent」としたときのものです。親クラスのメソッドを子クラスで同じように書けばそれが「オーバーライド」になります。簡単ですが、オーバーライドの補足でした。
インターフェースを使う
これに関しては、詳細の説明よりも動かしてみるのが一番だと思うので(実装してみるのがベスト)、実行結果を舌に載せておきます。
このように、作成したコマンドクラスを登録してやるだけで新しい処理を追加できます。しかしこれではMainメソッドの修正が必要になるのでイマイチです。
次回は、メインメソッドを修正しなくても良いようにリファクタリングします。
でわでわ。。。