我有類是關鍵字不具有繼承工作(基類是DerivedObject)=真正的「我怎樣才能避免」
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;
}
請注意,如果車輛不能越過障礙物,我會再次遞歸地調用相同的方法,以嘗試使用不同的車輛。 我的問題是爲什麼如果vehicle = SpeedCar那麼if (vehicle is Car)
評估爲true?可能是因爲它繼承了它。我怎麼能檢查車輛是否是SpeedCar而不是汽車。我現在可以調用ToString()方法,然後做一個正則表達式,但如果我重命名我的類,我會打破我的代碼...
換句話說,如果我通過的車輛不能跨越,它恰好是汽車或SpeedCar我將進入一個無限循環......
非常感謝!!!! –
@TonoNam:不客氣。順便說一句,你真的不應該隱藏繼承成員'CanCross'。使其成爲'virtual'並使用'override'關鍵字覆蓋後代類的行爲。另外,爲了拋棄醜陋的類型檢查,你可以添加一個虛擬屬性'Car.ReplaceWithCar'。 – Dennis
然後你的方法'Foo'看起來像這樣:'if(!car.CanCross(obstacle)){return car.ReplaceWithCar!= null? Foo(car.ReplaceWithCar):null; }' – Dennis