如何处理摘要 属性 in Java?

How to handle abstract property in Java?

假设我想要一个 class MyClass,其中有一个 属性 表示车辆。

交通工具可以是汽车或摩托车。

如果是汽车,我希望能够取回它的方向盘。

编辑:我的基本主张是摩托车没有方向盘,所以我想避免在摩托车中使用类似 getSteeringWheel 的东西 class。

我看到两个解决方案:

  1. 由两个 class 扩展的抽象车辆 class:汽车和摩托车

问题是,要从 MyClass 对象检索方向盘的类型,我必须执行如下操作:

Vehicle vehicle = getVehicle();
if (vehicle instanceof Car) {
    SteeringWheel steeringWheel = ((Car) vehicle).getSteeringWheel();
}

我想这不是很好。

  1. 包含一切的混凝土车辆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.