インターフェースとは、関連する機能をひとまとめにしたメンバーを持つ型です。クラスの使われ方と実装を切り離すことで、複数の異なる実装を可能にしたり、書式設定・比較・変換といった汎用的な振る舞いをサポートしたりできます。
インターフェースの構文はクラスの構文とよく似ていますが、メソッドはシグネチャーだけを書き、本体は書かない点が異なります。
public interface Language {
String getLanguageName();
String speak();
}
public class ItalianTraveller implements Language, Cloneable {
// from Language interface
public String getLanguageName() {
return "Italiano";
}
// from Language interface
public String speak() {
return "Ciao mondo";
}
// from Cloneable interface
public Object clone() {
ItalianTraveller it = new ItalianTraveller();
return it;
}
}
インターフェースで定義されたすべての操作は、それを実装するクラスで実装しなければなりません。
インターフェースには通常、インスタンスメソッドが含まれます。
Javaクラスライブラリにあるインターフェースの例としては、上で示したCloneableのほかにComparable<T>があります。
Comparable<T>インターフェースは、コレクションで汎用的な並べ替え順序が必要なときに実装します。
この演習では、ラジコンカーを使った作業をさらに進めていきます。
実験用の車が開発されたので、テストコースを改良して、量産モデルと実験モデルの両方を扱えるようにする必要があります。2種類の車はすでに完成しているので、両方をテストコースで扱う方法を考えましょう。
さらに、量産車も少しずつ成果を上げ始めています。チームのボスは、量産車のランキングを公開して競争心を維持したいと考えています。
RemoteControlCarインターフェースに次の2つのメソッドを追加してください。
drive():何も返しませんgetDistanceTravelled():intを返します次に、ProductionRemoteControlCarとExperimentalRemoteControlCarにRemoteControlCarインターフェースを実装させます。インターフェースが要求するすべてのメソッドを実装する必要があります。
.drive()を呼び出すたびに、車は一定の距離を進むようにします。
ProductionRemoteControlCarは10単位進みますExperimentalRemoteControlCarは20単位進みます.getDistanceTravelled()メソッドは、その車がこれまでに走行した単位数を返すようにします。
ProductionRemoteControlCar prod = new ProductionRemoteControlCar();
prod.drive();
prod.getDistanceTravelled();
// => 10
ExperimentalRemoteControlCar exp = new ExperimentalRemoteControlCar();
exp.drive();
exp.getDistanceTravelled();
// => 20
TestTrack.race(RemoteControlCar car)メソッドを実装し、その中でcarがdrive()を実行できるようにします。
TestTrack.race(new ProductionRemoteControlCar());
TestTrack.race(new ExperimentalRemoteControlCar());
// this should execute without an exception being thrown
ProductionRemoteControlCarクラスにComparable<T>インターフェースを実装してください。車のデフォルトの並べ替え順は、勝利数の降順にします。
静的メソッドTestTrack.getRankedCars()を実装して、渡された車を勝利数の降順に並べ替えて返すようにします。
ProductionRemoteControlCar prc1 = new ProductionRemoteControlCar();
ProductionRemoteControlCar prc2 = new ProductionRemoteControlCar();
prc1.setNumberOfVictories(2);
prc2.setNumberOfVictories(3);
List<ProductionRemoteControlCar> unsortedCars = new ArrayList<>();
unsortedCars.add(prc1);
unsortedCars.add(prc2);
List<ProductionRemoteControlCar> rankings = TestTrack.getRankedCars(unsortedCars);
// => rankings.get(0) == prc2
// => rankings.get(1) == prc1