C# 中最主要的物件導向建構單位是_類別_,它是資料(欄位)與行為(方法)的組合。類別的欄位與方法合稱為它的_成員_。
成員的存取權限可以透過存取修飾詞來限制,最常見的兩種是:
public:任何程式碼都能存取這個成員(沒有限制)。private:只有同一個類別內的程式碼可以存取這個成員。你可以把類別想成建立該類別執行個體的範本。要建立類別的執行個體(也稱為_物件_),會使用 new關鍵字:
class Car
{
}
// Create two car instances
var myCar = new Car();
var yourCar = new Car();
欄位有型別,而且可以定義在類別中的任何位置。
公開欄位以 PascalCase 命名,私有欄位則以 camelCase 命名,並在前面加上底線_:
class Car
{
// Accessible by anyone
public int Weight;
// Only accessible by code in this class
private string _color;
}
你可以選擇性地為欄位指定初始值。如果欄位_沒有_指定初始值,它會被設為該型別的預設值。執行個體的欄位值可以用點記法存取和更新。
class Car
{
// Will be set to specified value
public int Weight = 2500;
// Will be set to default value (0)
public int Year;
}
var newCar = new Car();
newCar.Weight; // => 2500
newCar.Year; // => 0
// Update value of the field
newCar.Year = 2018;
私有欄位通常會在呼叫方法時,作為副作用而被更新。這類方法通常不會回傳任何值,此時回傳型別應該是 void:
class CarImporter
{
private int _carsImported;
public void ImportCars(int numberOfCars)
{
// Update private field from public method
_carsImported = _carsImported + numberOfCars;
}
}
在這個練習裡,你會動手玩一台遙控車,那是你終於存夠錢才買下的。
遙控車一開始的電量是滿的(100%)。每次你用遙控器駕駛這台車,它就會前進 20 公尺,並消耗掉百分之一的電量。
這台遙控車有個炫麗的 LED 顯示器,會顯示兩項資訊:
"Driven <METERS> meters"。"Battery at <PERCENTAGE>%"。如果電量降到 0%,你就不能再駕駛這台車,而電量顯示器會顯示 "Battery empty"。
你有六個任務,每個任務都會操作遙控車的實例。
實作(static)RemoteControlCar.Buy()方法,回傳一台全新的遙控車實例:
RemoteControlCar car = RemoteControlCar.Buy();
實作RemoteControlCar.DistanceDisplay()方法,回傳 LED 顯示器上顯示的距離:
var car = RemoteControlCar.Buy();
car.DistanceDisplay();
// => "Driven 0 meters"
實作RemoteControlCar.BatteryDisplay()方法,回傳 LED 顯示器上顯示的電量百分比:
var car = RemoteControlCar.Buy();
car.BatteryDisplay();
// => "Battery at 100%"
實作RemoteControlCar.Drive()方法,更新行駛的公尺數:
var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
car.DistanceDisplay();
// => "Driven 40 meters"
更新RemoteControlCar.Drive()方法,讓它更新電量百分比:
var car = RemoteControlCar.Buy();
car.Drive();
car.Drive();
car.BatteryDisplay();
// => "Battery at 98%"
更新RemoteControlCar.Drive()方法,讓它在電量耗盡(0%)時既不增加行駛距離,也不減少電量百分比:
var car = RemoteControlCar.Buy();
// Drain the battery
// ...
car.DistanceDisplay();
// => "Driven 2000 meters"
car.BatteryDisplay();
// => "Battery empty"