私はクラスを持っています
Interface IVehicle
{
int numberOfWheels;
bool CanCross(string obstacle);
// etc
}
class Car : IVehicle
{
public int numberOfWheels = 4;
public bool CanCross(string obstacle)
{
switch(obstacle)
{
case "river":
return false;
case "grass":
return true;
// etc
}
}
}
class RaceCar: Car
{
public int numberOfWheels = 4;
public bool CanCross(string obstacle)
{
switch(obstacle)
{
case "river":
return false;
case "grass":
return false;
// etc
}
}
}
そして、私は方法を持っています:
public object Foo(IVehicle vehicle, string obstacle)
{
if(vehicle.CanCross(obstacle)==false)
{
if(vehicle is Car)
return Foo(new RaceCar(), obstacle);
else if(vehicle is RaceCar)
return Foo(new OldCar(), obstacle);
// etc
else
return null;
}
// implementation
return someObject;
}
車両が障害物を越えることができない場合は、別の車両で試すために同じメソッドを再帰的に再度呼び出すことに注意してください。私の質問は、なぜ車両= SpeedCarの場合、真if (vehicle is Car)
と評価されるのですか?おそらくそれを継承しているからでしょう。車両がSpeedCarであるが、Carではないかどうかを確認するにはどうすればよいですか。これで、ToString()メソッドを呼び出して正規表現を実行できますが、クラスの名前を変更すると、コードが壊れます...
言い換えれば、私が通過する車両が横断できず、それがたまたま車またはスピードカーである場合、私は無限ループに入ります...