我有这种使用 instanceof 和 cast 的代码,我想避免使用它们:
class Vehicle {}
class Boat extends Vehicle {
getFloating()
}
class Car extends Vehicle{
getWheels()
}
class UseVehicle{
void useVehicleAsCar(Vehicle vehicle){
// this method cant be change its parameter Vehicle, of course ;D
if (vehicle instanceof Car){
((Car)vehicle).getWheels()
}
}
}
解决方法如下:
abstract class Vehicle {
Car asCar(){return null;}
Boat asBoat(){return null;}
}
class Boat extends Vehicle {
getFloating(){};
Boat asBoat(){return this};
}
class Car extends Vehicle{
getWheels(){}
Car asCar(){return this;}
}
class UseVehicle{
void useVehicleAsCar(Vehicle vehicle){
// accept in exemple that object param is an instance of Car
vehicle.asCar().getWheels();
}
}
但是现在车辆类知道 child ....如果我想有一个总线类我必须在父类(super class)中添加方法
你有更好的东西吗?
最佳答案
这里的第一个解决方案是去掉 Vehicle
类。它没有定义 Car
和 Boat
之间的共同契约。
换句话说,Vehicle
与其子类的关系并不比java.lang.Object
与其子类的关系更有用。
现在,鉴于您无法更改 useVehicleAsCar
的签名,您别无选择,只能检查该方法实现中参数的运行时类。
您本可以使用特定的子类型重载此方法,但这显然是不可能的,因为您将 Vehicle
作为参数是有原因的(与您无法更改的参数相同) ).
当然有许多不受欢迎的方法来检查参数的具体类型,选择哪种方法主要取决于偏好。 我会坚持使用 instanceof
,因为与 asBoat
/asCar
替代方案相比,它保持清晰并保持Vehicle
的“契约(Contract)”没有(甚至更多)不必要的概念。
关于java - 避免 instanceof 和 cast,一个 Super Class 可以知道 children 类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58860552/