學習軌道
/
C#
C#
/
練習
/
遙控競賽
遙控競賽

遙控競賽

學習練習

簡介

介面

介面是一種型別,其中的成員定義了一組相關的功能。它將類別的使用與實作分隔開來,讓同一個類別能有多種不同的實作,或支援像是格式化、比較或轉換之類的泛型行為。

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

public interface ILanguage
{
    string LanguageName { get; set; }
    string Speak();
}

public class ItalianTaveller : ILanguage, ICloneable
{
    public string LanguageName { get; set; } =  "Italiano";

    public string Speak()
    {
        return "Ciao mondo";
    }

    public object Clone()
    {
        ItalianTaveller it = new ItalianTaveller();
        it.LanguageName = this.LanguageName;
        return it;
    }
}

介面定義的所有操作都必須實作。

介面可以包含執行個體方法和屬性,以及其他成員。

排序

若要讓一個物件能與另一個物件比較,它必須實作IComparable<T>介面。 這個介面只有一個需要實作的方法:int CompareTo(T other)。

CompareTo方法有三種可能的回傳值:

  • 值小於零:目前的物件小於另一個物件。
  • 值大於零:目前的物件大於另一個物件。
  • 值等於零:目前的物件等於另一個物件。

說明

在這個練習中,你會繼續研究遙控車。

實驗車已經開發出來了,而測試跑道需要調整,才能同時處理量產車和實驗車這兩種車款。這兩種車都已經打造完成,你需要想辦法讓它們都能在同一條測試跑道上運作。

此外,量產車也開始交出不錯的成績。車隊老闆希望透過公布量產車的排名,來維持競爭的氣氛。

1. 讓車輛能在同一條測試跑道上行駛

請在IRemoteControlCar介面中新增一個方法,公開這兩種車的Drive()實作。

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

2. 讓不同車款在測試跑道上行駛的距離能夠互相比較

請在IRemoteControlCar介面中新增一個屬性,公開這兩種車的DistanceTravelled屬性實作。

var prod = new ProductionRemoteControlCar();
TestTrack.Race(prod);
var exp = new ExperimentalRemoteControlCar();
TestTrack.Race(exp);
prod.DistanceTravelled
// => 10
exp.DistanceTravelled
// => 20

3. 讓量產車可以進行排名

請在ProductionRemoteControlCar類別中實作IComparable<T>介面。車輛的預設排序方式應為勝場數遞增。

請實作靜態的TestTrack.GetRankedCars(),回傳傳入的車輛,並依勝場數遞增排序。

var prc1 = new ProductionRemoteControlCar();
var prc2 = new ProductionRemoteControlCar();
prc1.NumberOfVictories = 3;
prc2.NumberOfVictories = 2;
var rankings = TestTrack.GetRankedCars(prc1, prc2);
// => rankings[1] == prc1
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
C# Exercism

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

註冊 Exercism,透過 62 個概念178 個練習 和真人引導來學習並精通 C#,全部免費。