javaにはインターフェースという機能があります。
インターフェースとは、メソッドの仕様(メソッド名、戻り値、引数)のみを定義したものです。
インターフェース単独では処理を実行できませんが、そのインターフェースを実装したクラスを定義することで処理を実行可能になります。
インターフェースを利用するメリットとしては、重複した記述を無くせることがあります。
オブジェクトを参照する際にインターフェース名を指定することで、そのインターフェースを実装している全てのクラスを指すことができます。一つの記述で複数のクラスに対応させることができるので、クラスごとに同じ記述を行う必要が無くなり、保守性が向上します。
(デザインパターンでもインターフェースは良く使われます)
言葉だと通じにくいと思うので、サンプルコードを用意しました。
【サンプルコード】
・FinancialProducts.java
package lesson1;
/* 金融商品(インターフェース) */
public interface FinancialProducts {
void passedAMonth(); // 1月過ぎた時の利息計算メソッド
}
・SingleInterestProducts.java
package lesson1;
/* 単利商品 */
public class SingleInterestProducts implements FinancialProducts {
int principal = 100; // 元金
int price = principal; // 商品価格
@Override
public void passedAMonth() {
price = (int) (price + principal * 0.1);
System.out.println("現在の商品価格:"+price);
}
}
・ComplexInterestProducts.java
package lesson1;
/* 複利商品 */
public class ComplexInterestProducts implements FinancialProducts {
int principal = 100; // 元金
int price = principal; // 商品価格
@Override
public void passedAMonth() {
price = (int) (price + price * 0.1);
System.out.println("現在の商品価格:"+price);
}
}
・Main.java
package lesson1;
public class Main {
public static void main(String[] args) {
/* オブジェクトの生成 */
SingleInterestProducts singleInterestProducts
= new SingleInterestProducts();
ComplexInterestProducts complexInterestProducts
= new ComplexInterestProducts();
/* 共通処理の実行 */
System.out.println
("SingleInterestProductsオブジェクト(単利商品)");
passedTwoMonths(singleInterestProducts);
System.out.println
("ComplexInterestProductsオブジェクト(複利商品)");
passedTwoMonths(complexInterestProducts);
}
/* 2月過ぎた時の利息計算メソッド */
public static void passedTwoMonths
(FinancialProducts financialProducts) {
financialProducts.passedAMonth();
financialProducts.passedAMonth();
/* インターフェースを使っていないと、
* SingleInterestProducts用とComplexInterestProducts用で
* 別々にメソッドを定義しなければならなかった */
}
}
【実行結果】
SingleInterestProductsオブジェクト(単利商品)
現在の商品価格:110
現在の商品価格:120
ComplexInterestProductsオブジェクト(複利商品)
現在の商品価格:110
現在の商品価格:121