インターフェースと抽象クラスの違い
抽象クラス
抽象クラスはabstractメソッドを付ける事で強制出来る、メソッドは通常通り作れる
⇒継承させることで、サブクラスのメソッドを強制的に付ける事が出来る。
つまり、派生したクラスに同一のメソッドを持たせる事と強制的にメソッドを作らせる事で
強制力を持たせるクラスが作れる
チームには、Aというクラスの中にはみんなが使う税率メソッドをつかって共通化されているけど
地域の税金は、地域によってちがうから個々の派生したクラスでメソッドを作ってね。
インターフェース
⇒インターフェースをimplementしたクラスは、インターフェースの箱に入れる事ができるつまり、インターフェースをimplementしておけば、条件によってAとBと切り替えが出来る。
サンプル(インターフェース)
public interface ControlPanelIf {
void play();
void pause();
void stop();
void forwardFast();
void backwordFast();
}
これを実装するクラスは以下のコードになります。
実際はもっと複雑になることが多いですが、サンプルということで書いていきましょう。
public class DvdDeck implements ControlPanelIf {
@Override
public void play() {
System.out.println("DVD再生");
}
@Override
public void stop() {
System.out.println("DVD再生停止");
}
@Override
public void pause() {
System.out.println("DVD一時停止");
}
@Override
public void forwardFast() {
System.out.println("DVD早送り");
}
@Override
public void backwardFast() {
System.out.println("DVD早戻し");
}
}
このDVDDeckクラスを使うクラスが以下とします。
public class DeckUser {
public static void main(String[] args) {
ControlPanelIf myDeck = createDeck(args[0]);
myDeck.play();
myDeck.forwardFast();
myDeck.pause();
myDeck.play();
myDeck.backwardFast();
}
private static ControlPanelIf createDeck(String deckType) {
ControlPanelIf deck;
if(deckType.equals("DVD") {
deck = new DvdDeck();
} else if(deckType.equals("BluRay") {
deck = new BluRayDeck();
} else if(deckType.equals("HDD") {
deck = new HddRayDeck();
} else {
deck = new DvdDeck();
}
return deck;
}
}