要建立_類別_的實例,可以透過new運算子呼叫它的_建構子_。建構子是一種特殊的方法,目的是初始化剛建立的實例。建構子看起來和一般方法一樣,但沒有回傳型別,而且名稱要與類別名稱相同。
class Library
{
private int books;
public Library()
{
// Initialize the books field
this.books = 10;
}
}
// This will call the constructor
var library = new Library();
和一般方法一樣,建構子也可以有參數。建構子的參數通常會存成(private)欄位,方便之後存取,或是用於一次性的計算。就像傳遞引數給一般方法一樣,你也可以傳遞引數給建構子。
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%。實作(靜態)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