java - 如何在 Java 中处理抽象属性?
问题描述
假设我想要一个 MyClass 类,除其他外,它具有代表车辆的属性。
车辆可以是汽车或摩托车。
如果是汽车,我希望能够取回它的方向盘。
编辑:我的基本主张是摩托车没有方向盘,所以我想避免在摩托车类中使用 getSteeringWheel 之类的东西。
我看到两个解决方案:
- 由两个类扩展的抽象车辆类:汽车和摩托车
问题是,从 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 将是一个 akward 类,因为如果对象的类型是 MOTORCYCLE 则 getSteeringWheel() 方法没有多大意义。
哪个更好?还有其他解决方案吗?谢谢!
解决方案
避免使用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' 是否真的是一个英文名词)
推荐阅读
- laravel - Laravel 路由访问类别和显示方法
- ios - 从 web json 解析图像
- php - 在特定位置将元素添加到 PHP 循环中
- bash - 在 bash 中使用 IFS 而不是 whitepace
- android - 在 NestedScrollView 中使用 RecyclerView 为所有项目调用 onBindView
- python-3.x - Selenium 和 Python 3:在 otto.de 上选择搜索框
- android - 在recyclerview的项目中选择多个复选框并将它们保存在Hashmap中
- java - 使用 GSON 按变量键对 JsonArray 进行排序
- java - DateTime 转换为本地时间的问题
- javascript - JavaScript 中的装饰函数