とりあえず雑記帳(跡地)
ようやくクラス継承の登場
最終更新:
fujiyan
-
view
同じこと書くのは面倒くさい
先に作った、各演算のクラスですが、どうにもこうにも同じような記述が目立ちます。
同じインターフェースを実装するクラスというのは、大枠では実装が似てしまうことは良くあります。
同じインターフェースを実装するクラスというのは、大枠では実装が似てしまうことは良くあります。
そこで、共通する内容については基底クラスとしてまとめ、違う部分についてのみ実装することで楽をします。
まずは基底クラスを抽象クラスとして定義
package jp.fujiyan.binaryoperation4;
/**
* 演算子の標準的な実装です。
*
* @author Fujiyan
*/
public abstract class StandardOperator implements IBinaryOperator {
protected String expression;
protected String result;
protected String errorMessage = null;
public boolean isError() {
return (errorMessage != null);
}
public String getErrorMessage() {
return errorMessage;
}
public String getExpression() {
return expression;
}
public String getResult() {
return result;
}
}
加算
package jp.fujiyan.binaryoperation4.operator;
import jp.fujiyan.binaryoperation4.StandardOperator;
/**
* 加算です。
*
* @author Fujiyan
*/
public class Addition extends StandardOperator {
public String getChoiseString() {
return "加算";
}
public void calculate(int value1, int value2) {
expression = String.valueOf(value1) + " + " + String.valueOf(value2);
result = String.valueOf(value1 + value2);
}
}
減算
package jp.fujiyan.binaryoperation4.operator;
import jp.fujiyan.binaryoperation4.StandardOperator;
/**
* 減算です。
*
* @author Fujiyan
*/
public class Subtraction extends StandardOperator {
public String getChoiseString() {
return "減算";
}
public void calculate(int value1, int value2) {
expression = String.valueOf(value1) + " - " + String.valueOf(value2);
result = String.valueOf(value1 - value2);
}
}
乗算
package jp.fujiyan.binaryoperation4.operator;
import jp.fujiyan.binaryoperation4.StandardOperator;
/**
* 乗算です。
*
* @author Fujiyan
*/
public class Multiplication extends StandardOperator {
public String getChoiseString() {
return "乗算";
}
public void calculate(int value1, int value2) {
expression = String.valueOf(value1) + " × " + String.valueOf(value2);
result = String.valueOf(value1 * value2);
}
}
除算
package jp.fujiyan.binaryoperation4.operator;
import jp.fujiyan.binaryoperation4.StandardOperator;
/**
* 除算です。
*
* @author Fujiyan
*/
public class Division extends StandardOperator {
public String getChoiseString() {
return "除算";
}
public void calculate(int value1, int value2) {
if (value2 == 0) {
// 0除算
errorMessage = "0で割ることはできません。";
return;
}
expression = String.valueOf(value1) + " ÷ " + String.valueOf(value2);
result = String.valueOf(value1 / value2) + "(余り " + String.valueOf(value1 % value2) + ")";
}
}
累乗
package jp.fujiyan.binaryoperation4.operator;
import jp.fujiyan.binaryoperation4.StandardOperator;
/**
* 累乗です。
*
* @author Fujiyan
*/
public class Power extends StandardOperator {
public String getChoiseString() {
return "累乗";
}
public void calculate(int value1, int value2) {
expression = String.valueOf(value1) + " ^ " + String.valueOf(value2);
result = String.valueOf((long) Math.pow(value1, value2));
}
}
※BinaryOperationクラスは変更なし
基底クラスを用いることで、実装が格段に楽になりました。
基底クラスは、共通部分のみ定義しているため、抽象クラスとして、実装しない部分があっても良いようにしておきます。
基底クラスは、共通部分のみ定義しているため、抽象クラスとして、実装しない部分があっても良いようにしておきます。
よく「インターフェースと抽象クラスの使い分けが判らない」という疑問が、オブジェクト指向プログラミングの習いたての頃に出ますが、
「インターフェースこそが本質。抽象クラスはインターフェースの実装を楽にするための便利屋」と考えておいてイイと思います。
「インターフェースこそが本質。抽象クラスはインターフェースの実装を楽にするための便利屋」と考えておいてイイと思います。