轨道
/
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#,全部免费。