首页 > 解决方案 > 如何在 Java 中处理抽象属性?

问题描述

假设我想要一个 MyClass 类,除其他外,它具有代表车辆的属性。

车辆可以是汽车或摩托车。

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

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

我看到两个解决方案:

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

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

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

我想这不是很好。

  1. 包含所有内容的具体 Vehicle 类

然后我会做这样的事情:

Vehicle vehicle = getVehicle();
if (VehicleTypeEnum.CAR.equals(vehicle.getType())) {
    SteeringWheel steeringWheel = vehicle.getSteeringWheel();
}

但是 Vehicle 将是一个 akward 类,因为如果对象的类型是 MOTORCYCLE 则 getSteeringWheel() 方法没有多大意义。

哪个更好?还有其他解决方案吗?谢谢!

标签: javacastingpropertiesabstractinstanceof

解决方案


避免使用instanceof,因为它会破坏您的 OOP 设计。相反,找到汽车和摩托车的共同点。两者都有一个负责转向的部分。将其提取到超类中,并在子类中实现实际的转向。

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' 是否真的是一个英文名词)


推荐阅读