【发布时间】:2018-06-01 16:52:56
【问题描述】:
假设我想要一个 MyClass 类,其中包括一个代表车辆的属性。
车辆可以是汽车或摩托车。
如果是汽车,我希望能够取回它的方向盘。
编辑:我的基本主张是摩托车没有方向盘,所以我想避免在摩托车类中使用 getSteeringWheel 之类的东西。
我看到了两种解决方案:
- 由两个类扩展的抽象 Vehicle 类:汽车和摩托车
问题在于,从 MyClass 对象中,要检索方向盘的类型,我必须执行以下操作:
Vehicle vehicle = getVehicle();
if (vehicle instanceof Car) {
SteeringWheel steeringWheel = ((Car) vehicle).getSteeringWheel();
}
我认为这不是很好。
- 包含所有内容的具体 Vehicle 类
然后我会做这样的事情:
Vehicle vehicle = getVehicle();
if (VehicleTypeEnum.CAR.equals(vehicle.getType())) {
SteeringWheel steeringWheel = vehicle.getSteeringWheel();
}
但是 Vehicle 将是一个错误的类,因为如果对象的类型是 MOTORCYCLE,那么 getSteeringWheel() 方法没有多大意义。
哪个更好?还有其他解决方案吗?谢谢!
【问题讨论】:
-
你也可以使用接口
HasSteeringWheel并且只在有方向盘的类上实现它 -
我仍然需要在 Motorcycle 类中实现 hasSteeringWheel 方法,我想避免这种情况,因为我认为摩托车没有方向盘。
-
您能否备份并解释为什么可以与
Vehicle有效交互的代码有时会关心Car的SteeringWheel?Vehicle是一种抽象,它们应该专注于操作,而不是属性。也就是说,您应该告诉车辆(或其驾驶员)去哪里,并让它适当地解释信息,而不是拿到汽车的方向盘并操纵它。司机将使用汽车的方向盘,骑手将使用她的摩托车车把,计算机将适当地设置开关以引导火车到达目的地,等等。 -
你能不能在摩托车上实现它并返回null。那么你只是执行一个空检查?也许这很糟糕
-
@erickson 我明白你的意思,我会尝试看看如何在我的情况下应用它。谢谢!
标签: java casting properties abstract instanceof