创建类的实例,需要通过new运算符调用它的构造函数。构造函数是一种特殊的方法,用于初始化新创建的实例。它的写法和普通方法一样,但没有返回类型,而且名称与类名相同。
class Library
{
private int books;
public Library()
{
// Initialize the books field
this.books = 10;
}
}
// This will call the constructor
var library = new Library();
和普通方法一样,构造函数也可以有形参。构造函数的形参通常会存储为(私有)字段,以便之后访问,或者用在一次性的计算中。就像向普通方法传递实参那样,也可以向构造函数传递实参。
class Building
{
private int numberOfStories;
private int totalHeight;
public Building(int numberOfStories, double storyHeight)
{
this.numberOfStories = numberOfStories;
this.totalHeight = numberOfStories * storyHeight;
}
}
// Call a constructor with two arguments
var largeBuilding = new Building(55, 6.2)
在这个练习中,你将组织各种遥控车之间的比赛。每辆车都有自己的速度和电池耗电特性。
车一开始的电池电量是满的(100%)。每次用遥控器驾驶车辆时,车会前进相当于其速度的距离(以米为单位),剩余电量百分比则减少它的电池耗电量。
如果一辆车的电池电量低于它的电池耗电百分比,就不能再驾驶这辆车了。
每条赛道都有自己的距离。测试车辆的方式,是检查它们能否在电量耗尽之前跑完赛道。
一共有六个任务,每个任务都会用到遥控车实例。
为RemoteControlCar类定义一个构造函数,接收车辆的速度(以米为单位)和电池耗电百分比作为它的两个形参(类型都是int),这样就可以创建一辆遥控车:
int speed = 5;
int batteryDrain = 2;
var car = new RemoteControlCar(speed, batteryDrain);
为RaceTrack类定义一个构造函数,接收赛道的距离(以米为单位)作为它唯一的形参(类型是int),这样就可以创建一条赛道:
int distance = 800;
var raceTrack = new RaceTrack(distance);
实现RemoteControlCar.Drive()方法,让它根据车辆的速度更新已行驶的米数。同时实现RemoteControlCar.DistanceDriven()方法,返回车辆已行驶的米数:
int speed = 5;
int batteryDrain = 2;
var car = new RemoteControlCar(speed, batteryDrain);
car.Drive();
car.DistanceDriven();
// => 5
更新RemoteControlCar.Drive()方法,让它根据车辆的电池耗电量消耗电量。同时实现RemoteControlCar.BatteryDrained()方法,用来表示电池是否已经耗尽:
int speed = 5;
int batteryDrain = 2;
var car = new RemoteControlCar(speed, batteryDrain);
car.Drive();
car.BatteryDrained();
// => false
最畅销的遥控车是 Nitro,它的最高速度高达 50 米,电池耗电量为 4%。实现(static)RemoteControlCar.Nitro()方法,返回这种类型的车:
var car = RemoteControlCar.Nitro();
car.Drive();
car.DistanceDriven();
// => 50
要想跑完一条赛道,车辆必须能够行驶赛道的距离。也就是说,它不能在冲过终点线之前耗尽电量。实现RaceTrack.TryFinishTrack()方法,它接收一个RemoteControlCar实例作为形参,如果这辆车能跑完赛道就返回true,否则返回false:
int speed = 5;
int batteryDrain = 2;
var car = new RemoteControlCar(speed, batteryDrain);
int distance = 100;
var raceTrack = new RaceTrack(distance);
raceTrack.TryFinishTrack(car);
// => true