C#の中心となるオブジェクト指向の構成要素は、_クラス_です。クラスは、データ(フィールド)と振る舞い(メソッド)を組み合わせたものです。クラスのフィールドとメソッドは、その_メンバー_と呼ばれます。
メンバーへのアクセスは、アクセス修飾子で制限できます。よく使われるのは次の2つです。
public:メンバーはどのコードからもアクセスできます(制限なし)。private:メンバーは同じクラス内のコードからしかアクセスできません。クラスは、そのクラスのインスタンスを作るためのテンプレートだと考えることができます。クラスのインスタンス(_オブジェクト_とも呼ばれます)を作るには、newキーワードを使います。
class Car
{
}
// Create two car instances
var myCar = new Car();
var yourCar = new Car();
フィールドには型があり、クラス内のどこにでも定義できます。
publicフィールドはパスカルケースで、privateフィールドはキャメルケースで定義し、先頭にアンダースコア_を付けます。
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;
privateフィールドは通常、メソッドを呼び出した副作用として更新されます。このようなメソッドは通常、値を返しません。その場合、戻り値の型はvoidにする必要があります。
class CarImporter
{
private int _carsImported;
public void ImportCars(int numberOfCars)
{
// Update private field from public method
_carsImported = _carsImported + numberOfCars;
}
}
この演習では、ラジコンカーを操作して遊びます。ようやくお金を貯めて買えるようになった車です。
車のバッテリーは、満充電(100%)の状態から始まります。リモコンで車を1回動かすたびに、車は20メートル進み、バッテリーが1パーセント減ります。
このラジコンカーには、2つの情報を表示するおしゃれなLEDディスプレイが付いています。
"Driven <METERS> meters"です。"Battery at <PERCENTAGE>%"です。バッテリーが0%になると、もう車を動かすことはできません。そのとき、バッテリーの表示は"Battery empty"になります。
タスクは6つあり、どれもラジコンカーのインスタンスを扱います。
新品のラジコンカーのインスタンスを返す、(_static_な)RemoteControlCar.Buy()メソッドを実装してください:
RemoteControlCar car = RemoteControlCar.Buy();
LEDディスプレイに表示される距離を返すRemoteControlCar.DistanceDisplay()メソッドを実装してください:
var car = RemoteControlCar.Buy();
car.DistanceDisplay();
// => "Driven 0 meters"
LEDディスプレイに表示されるバッテリー残量を返すRemoteControlCar.BatteryDisplay()メソッドを実装してください:
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%"
バッテリーが切れた(0%の)ときは、走行距離を増やさず、バッテリー残量も減らさないようにRemoteControlCar.Drive()メソッドを更新してください:
var car = RemoteControlCar.Buy();
// Drain the battery
// ...
car.DistanceDisplay();
// => "Driven 2000 meters"
car.BatteryDisplay();
// => "Battery empty"