Interfaceの定義。
ルール
- Interfaceという名前でclassみたいなノリで作成する
- Interfaceを作ったら頭の文字を
I
にするのが慣習 (IFooなど) - interfaceを使う側のclassで
implements Interface name
を記述する - interfaceをimplementsしたclassでは、interfaceのmethod全てをoverrideしないといけない
- Main側ではInterfaceのobjを宣言することはできるが、新しくinterfaceのobjを作成(new)はできない。(interfaceはabstractで、実体が無いため)
- Main側でInterfaceを複数classで使用する場合は大人しくInterface型でobjを宣言しましょう
Tips
ArrayList<String> array = new ArrayList<String>
とか書いてたけど、List<String> array = new ArrayList<~>()
ってできるらしい。なんでかっていうと、List
はinterfaceで、ArrayList
にimplementsされているから。- InheritanceかInterface、どっちを使うか迷った時。まずはclass同士の関係性を考えよう。例えばAnimalクラスなら犬も鳥も歩ける(Walkメソッドとか)ので、そういう部分だけ共通としてInterfaceにするとか、ってのが考えられる。まあこれは設計次第というか、クラスの関係性次第ですね...
ISample obj = new Test(num)
としてもコンパイルは通るが、Testクラスに固有するメソッドは使用できない。例えば下記コード例のobj.getPeron()
はコンパイルエラーになる。Interface型でobjを生成した場合は、((Test)obj).getPeron
とTest型にキャストしてあげれば、Test固有のメソッドも使用できるようになる。
Interface
public interface ISample { void sampleMethodA(); void sampleMethodB(); int sampleMethodC(int something); String sampleMethodD(String something); boolean sampleMethodE(boolean something); }
Class
public class Test implements ISample{ private boolean peron; private int num; private String something; Test(int num) { this.num = num; } public boolean getPeron() { return this.peron; } @Override public void sampleMethodA() { System.out.println("aaaaaa"); } @Override public void sampleMethodB() { System.out.println("aaaaaa"); } @Override public int sampleMethodC(int a) { System.out.println(a); } @Override public String sampleMethodD(String a) { System.out.println(a); } @Override public boolean sampleMethodE(boolean a) { System.out.println(a); } }
Main
public class Interfaces { public static void main(String[] args) { ISample obj; obj = new Test(30); obj.sampleMethodA(); } }