介面是一種型別,其中的成員定義了一組相關的功能。它將類別的使用與實作分隔開來,讓同一個類別能有多種不同的實作,或支援像是格式化、比較或轉換之類的泛型行為。
介面的語法和類別或結構相似,差別在於方法和屬性只以簽章的形式出現,不提供主體。
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方法有三種可能的回傳值:
在這個練習中,你會繼續研究遙控車。
實驗車已經開發出來了,而測試跑道需要調整,才能同時處理量產車和實驗車這兩種車款。這兩種車都已經打造完成,你需要想辦法讓它們都能在同一條測試跑道上運作。
此外,量產車也開始交出不錯的成績。車隊老闆希望透過公布量產車的排名,來維持競爭的氣氛。
請在IRemoteControlCar介面中新增一個方法,公開這兩種車的Drive()實作。
TestTrack.Race(new ProductionRemoteControlCar());
TestTrack.Race(new ExperimentalRemoteControlCar());
// this should execute without an exception being thrown
請在IRemoteControlCar介面中新增一個屬性,公開這兩種車的DistanceTravelled屬性實作。
var prod = new ProductionRemoteControlCar();
TestTrack.Race(prod);
var exp = new ExperimentalRemoteControlCar();
TestTrack.Race(exp);
prod.DistanceTravelled
// => 10
exp.DistanceTravelled
// => 20
請在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