_クラス_のインスタンスを作るには、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%)の状態からスタートします。リモコンでカーを走らせるたびに、車はその速度の分だけメートル進み、バッテリー残量のパーセンテージがバッテリー消費の分だけ減ります。
バッテリー残量がバッテリー消費のパーセンテージを下回ると、そのカーはもう走らせられません。
それぞれのレーストラックには距離があります。カーは、バッテリーを使い切らずにトラックを完走できるかどうかでテストされます。
ここには6つのタスクがあり、それぞれがラジコンカーのインスタンスを扱います。
RemoteControlCarクラスのコンストラクターを定義して、ラジコンカーを作成できるようにします。このコンストラクターは、車の速度(メートル)とバッテリー消費のパーセンテージを2つの仮引数として受け取ります(どちらも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