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 米,并消耗 1% 的电量。
这辆遥控车有一个酷炫的 LED 显示屏,可以显示两项信息:
"Driven <METERS> meters"。"Battery at <PERCENTAGE>%"。如果电量为 0%,你就不能再驾驶这辆车了,电量显示屏会显示 "Battery empty"。
你有六个任务,每个任务都会用到遥控车实例。
实现(静态)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"