インターフェースの変数
インターフェースの変数を定義することができます。定義した変数にはインターフェースを実装したクラスのインスタンスを格納することになります。そして、この変数を利用して宣言したメソッド、定義した変数を利用することができます。
インターフェースの引数
インターフェースは引数にすることもできます。下記にプログラム例を掲載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class Main { public static void main(String[] args) { CalSqua squ = new CalSqua(); CalTriangle tri = new CalTriangle(); sub(squ,10,5); sub(tri,10,5); } public static void sub(Menseki m,int x,int y){ System.out.println(m.getMensaki(x, y)); } } interface Menseki{ int getMensaki(int x,int y); } class CalSqua implements Menseki { public int getMensaki(int x,int y){ return (x * y ); } } class CalTriangle implements Menseki { public int getMensaki(int x,int y){ return ((x * y )/2); } } |
6行目で関数subを呼び出していますが、引数squはクラスCalSquaのインスタンスです。そして、インターフェースMensekiを実装しています。
6 |
sub(squ,10,5); |
4 |
CalSqua squ = new CalSqua(); |
17 |
class CalSqua implements Menseki { |
呼び出されるメソッドsubでは、squのインスタンスを「Menseki m」で受け取ってます。つまりインターフェース変数で受け取っています。
9 |
public static void sub(Menseki m,int x,int y){ |
これでインターフェース変数mを利用して、インターフェースで宣言したメソッドが実行できます。
10 |
System.out.println(m.getMensaki(x, y)); |
実務で見られる使い方
次のように、より複雑なソースコードを見かけます。このプログラムはクラスのメソッド処理を「正方形の面積計算」、「三角形の面積計算」に切り替えることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package jp.ayax.object; public class Main { public static void main(String[] args) { CalSqua squ = new CalSqua(); CalTriangle tri = new CalTriangle(); CalEtc cal = new CalEtc(4,5); cal.change(squ); System.out.println(cal.CalMenseki()); cal.change(tri); System.out.println(cal.CalMenseki()); } } interface Menseki{ int getMenseki(int x,int y); } class CalSqua implements Menseki { public int getMenseki(int x,int y){ return (x * y ); } } class CalTriangle implements Menseki { public int getMenseki(int x,int y){ return ((x * y )/2); } } class CalEtc{ int x,y; Menseki m; public CalEtc(int x,int y){ this.x = x; this.y = y; } public void change(Menseki m){ this.m = m; } public int CalMenseki(){ return m.getMenseki(x, y); } } |
30行目~44行目でクラスCalEtcが定義されていますが、その中でインターフェースを保持する変数mがあります。
32 |
Menseki m; |
インターフェースを格納するのは、メソッドchangeを通じて外部から行われます。格納されるインターフェースの内容により、「正方形の面積計算」、「三角形の面積計算」が切り替わります。
38 39 40 |
public void change(Menseki m){ this.m = m; } |
面積計算の処理はCalMensekiを通じで、インターフェース変数mを利用して行われます。
41 42 43 |
public int CalMenseki(){ return m.getMenseki(x, y); } |
「正方形の面積計算」、「三角形の面積計算」の切り替えは10行目、12行目で行っています。
10 |
cal.change(squ); |
12 |
cal.change(tri); |
インターフェースを利用することにより状況に応じてメソッドの処理を入れ替えることができます。どのように利用するか?、と考えると頭を悩ますことになりますが、このようなテクニックを利用したプログラムが多く存在します。まずはこのようなプログラムが存在していることを把握して、オブジェクト指向を是非とも「やり過ごして」ください。