gpt4 book ai didi

c# - is 关键字不适用于继承(基类是派生对象)= true "How could I avoid that"

转载 作者:行者123 更新时间:2023-11-30 18:48:41 25 4
gpt4 key购买 nike

我有课

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;
}

请注意,如果车辆无法越过障碍物,我会再次递归调用相同的方法,以便尝试使用不同的车辆。 我的问题是为什么 if vehicle = SpeedCar 那么 if (vehicle is Car) 的计算结果为 true ?可能是因为它继承自它。我如何检查车辆是否是 SpeedCar 而不是汽车。我现在可以调用 ToString() 方法,然后执行正则表达式,但是如果我重命名我的类,我将破坏我的代码...

换句话说,如果我超过的车辆无法通过,而它恰好是 Car 或 SpeedCar,我将进入无限循环...

最佳答案

您可以使用 is 运算符执行此操作 - 事实上,它比使用 GetType() 快一些。

您的继承层次结构是 IVehicle->Car->RaceCar,因此任何 RaceCar 也会是 CarIVehicle。如果您首先测试基类,您的代码将永远不会进行更具体的测试,因为基类无论如何都会匹配 - 这就是您遇到问题的原因。

在需要对继承链中的类执行不同操作的情况下,正确的测试方法是首先测试更具体(更派生)的类,最后测试基类。

if (vehicle is RaceCar)
{
// code
}
else if (vehicle is Car)
{
// code
}
else
{
// code
}

Dennis' answer使用虚函数可以简化这些情况是正确的,因为在大多数情况下,当你有虚函数时你可以避免这些类型的测试 - 简单地说所有派生类都可以提供他们自己的函数实现(或者依赖于基础实现而不在适当的时候覆盖它).如果基类实现没有意义,您可以使用 abstract 关键字来指示派生类必须提供一个不依赖于基类的实现。这些派生类然后使用override 来实现这些抽象函数。

关于c# - is 关键字不适用于继承(基类是派生对象)= true "How could I avoid that",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com