如何处理摘要 属性 in Java?
How to handle abstract property in Java?
假设我想要一个 class MyClass,其中有一个 属性 表示车辆。
交通工具可以是汽车或摩托车。
如果是汽车,我希望能够取回它的方向盘。
编辑:我的基本主张是摩托车没有方向盘,所以我想避免在摩托车中使用类似 getSteeringWheel 的东西 class。
我看到两个解决方案:
- 由两个 class 扩展的抽象车辆 class:汽车和摩托车
问题是,要从 MyClass 对象检索方向盘的类型,我必须执行如下操作:
Vehicle vehicle = getVehicle();
if (vehicle instanceof Car) {
SteeringWheel steeringWheel = ((Car) vehicle).getSteeringWheel();
}
我想这不是很好。
- 包含一切的混凝土车辆class
然后我会做这样的事情:
Vehicle vehicle = getVehicle();
if (VehicleTypeEnum.CAR.equals(vehicle.getType())) {
SteeringWheel steeringWheel = vehicle.getSteeringWheel();
}
但是 Vehicle 会很尴尬 class,因为如果对象的类型是 MOTORCYCLE,那么 getSteeringWheel() 方法就没有多大意义。
哪个更好?还有其他解决方案吗?谢谢!
避免使用 instanceof
,因为它会 break your OOP design。相反,找到汽车和摩托车的共同点。两者都有一个负责转向的部分。将其提取到超类中,并在子类中实现实际的转向。
public abstract class Vehicle {
public abstract Steer getSteer();
}
public abstract class Steer {
public abstract left();
public abstract right();
}
public class Car extends Vehicle {
@Override
public SteeringWheel getSteer() {
return wheel;
}
}
public class Motorcycle extends Vehicle {
@Override
public SteeringBar getSteer() {
return bar;
}
}
(非母语,我不确定'steer'是否真的是英文名词)
抱歉,如果问题措辞不当,但我认为在您的帮助下我设法解决了我的问题。目前我有这样的东西:
public class MyClass {
private Vehicle vehicle;
public void doStuff() {
doNonVehicleStuff();
Vehicle vehicle = getVehicle();
doRegularStuff(vehicle);
if (vehicle instanceof Car) {
SteeringWheel steeringWheel = ((Car) vehicle).getSteeringWheel();
doSteeringWheelStuff(steeringWheel);
}
}
但实际上我应该这样做:
public void doStuffWithVehicle() {
doNonVehicleStuff();
getVehicle().doStuff();
}
使用 Car
覆盖 doStuff
方法以包含 doSteeringWheelStuff
除了 regularStuff
.
假设我想要一个 class MyClass,其中有一个 属性 表示车辆。
交通工具可以是汽车或摩托车。
如果是汽车,我希望能够取回它的方向盘。
编辑:我的基本主张是摩托车没有方向盘,所以我想避免在摩托车中使用类似 getSteeringWheel 的东西 class。
我看到两个解决方案:
- 由两个 class 扩展的抽象车辆 class:汽车和摩托车
问题是,要从 MyClass 对象检索方向盘的类型,我必须执行如下操作:
Vehicle vehicle = getVehicle();
if (vehicle instanceof Car) {
SteeringWheel steeringWheel = ((Car) vehicle).getSteeringWheel();
}
我想这不是很好。
- 包含一切的混凝土车辆class
然后我会做这样的事情:
Vehicle vehicle = getVehicle();
if (VehicleTypeEnum.CAR.equals(vehicle.getType())) {
SteeringWheel steeringWheel = vehicle.getSteeringWheel();
}
但是 Vehicle 会很尴尬 class,因为如果对象的类型是 MOTORCYCLE,那么 getSteeringWheel() 方法就没有多大意义。
哪个更好?还有其他解决方案吗?谢谢!
避免使用 instanceof
,因为它会 break your OOP design。相反,找到汽车和摩托车的共同点。两者都有一个负责转向的部分。将其提取到超类中,并在子类中实现实际的转向。
public abstract class Vehicle {
public abstract Steer getSteer();
}
public abstract class Steer {
public abstract left();
public abstract right();
}
public class Car extends Vehicle {
@Override
public SteeringWheel getSteer() {
return wheel;
}
}
public class Motorcycle extends Vehicle {
@Override
public SteeringBar getSteer() {
return bar;
}
}
(非母语,我不确定'steer'是否真的是英文名词)
抱歉,如果问题措辞不当,但我认为在您的帮助下我设法解决了我的问题。目前我有这样的东西:
public class MyClass {
private Vehicle vehicle;
public void doStuff() {
doNonVehicleStuff();
Vehicle vehicle = getVehicle();
doRegularStuff(vehicle);
if (vehicle instanceof Car) {
SteeringWheel steeringWheel = ((Car) vehicle).getSteeringWheel();
doSteeringWheelStuff(steeringWheel);
}
}
但实际上我应该这样做:
public void doStuffWithVehicle() {
doNonVehicleStuff();
getVehicle().doStuff();
}
使用 Car
覆盖 doStuff
方法以包含 doSteeringWheelStuff
除了 regularStuff
.