學習軌道
/
Java
Java
/
練習
/
遙控競賽
遙控競賽

遙控競賽

學習練習

簡介

介面

介面是一種型別,包含定義一組相關功能的成員。它將類別的使用與實作分離,允許多種不同的實作,或支援某些泛型行為,例如格式化、比較或轉換。

介面的語法與類別相似,差別在於方法只以簽章的形式出現,不提供主體。

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;
    }
}

介面定義的所有操作,都必須由實作類別實作。

介面通常包含實例方法。

除了上面示例的Cloneable之外,Java 類別庫中還有一個介面的例子是Comparable<T>。當集合中需要預設的泛型排序順序時,可以實作Comparable<T>介面。

說明

在這個練習中,你會對遙控車再多做一些研究。

一款實驗車已經開發完成,測試跑道也需要調整,才能同時容納量產車和實驗車。 這兩種車都已經打造完成,你需要想辦法讓它們都能在測試跑道上運行。

此外,量產車也開始取得一些成績。 團隊老大很希望透過公布量產車的排名,來維持競爭的氣氛。

1. 實作介面

請為RemoteControlCar介面新增兩個方法:

  • drive(),不回傳任何值,以及
  • getDistanceTravelled(),回傳一個 int。

接著讓ProductionRemoteControlCar和ExperimentalRemoteControlCar實作RemoteControlCar介面。 這包括實作介面要求的所有方法。

2. 行駛

每次呼叫.drive()時,車子都應該行駛一段特定距離:

  • 一輛ProductionRemoteControlCar行駛 10 個單位,
  • 一輛ExperimentalRemoteControlCar行駛 20 個單位。

.getDistanceTravelled()方法應該回傳車子至今累積行駛的單位數。

ProductionRemoteControlCar prod = new ProductionRemoteControlCar();
prod.drive();
prod.getDistanceTravelled();
// => 10
        
ExperimentalRemoteControlCar exp = new ExperimentalRemoteControlCar();
exp.drive();
exp.getDistanceTravelled();
// => 20

3. 競速

實作TestTrack.race(RemoteControlCar car)方法,讓每輛car都能drive()。

TestTrack.race(new ProductionRemoteControlCar());
TestTrack.race(new ExperimentalRemoteControlCar());
// this should execute without an exception being thrown

4. 讓量產車可以排序

請在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
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Java Exercism

準備好開始 遙控競賽 了嗎?

註冊 Exercism,透過 26 個概念158 個練習 和真人引導來學習並精通 Java,全部免費。